例3.1 为用户WANG定义一个学生-课程模式S-T
首先我们先在数据库(stu)里建立一个用户WANG
然后执行命令
CREATE SCHEMA "S-T" AUTHORIZATION WANG;
例3.2 CREATE SCHEMA AUTHORIZATION WANG;
这里没有指定schema_name,标准sql应该默认会讲schema_name默认设置为用户名,但在SQL server中不是这样的,运行标题那个语句不会报错,但架构那里也没有任何变化。在微软的帮助文档里,看到一个备注。微软的帮助文档点此
(题外话,微软tql)
看样子T-SQL在这种情况下不会报错也不会创建架构。
例3.3 为用户ZHANG创建了一个模式TEST,并且在其中定义一个表TAB1:
执行命令
CREATE SCHEMA TEST AUTHORIZATION WANG
CREATE TABLE TAB1 ( COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2)
);
注意上面第一行是没有分号的,这样写可以省略TEST。
下面在TEST下创建TAB2
下面这个语句他会有红线提醒,但是执行没有问题,(这个问题我暂时没有解决)
CREATE TABLE TEST.TAB2 ( COL1 SMALLINT);
例3.4 DROP SCHEMA TEST CASCADE;
删除test模式
执行标题的代码会出现
我们删除CASCADE,还是不行
查一下帮助文档
看来如果架构里面有数据库对象就不能删除他,我们得先删除其内的对象。
在这我们先通过gui删除表。删除好之后我们继续执行上面的命令
删除成功!
例3.5 建立“学生”表Student。学号是主码,姓名取值唯一
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) UNIQUE,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
有人可能会说,这个Student前面为什么没有架构的名字。其实他会默认有一个名字,在这里就是dbo架构。
例3.6 建立一个“课程”表Course
CREATE TABLE Course
(Cno CHAR(4) PRIMARY KEY,
Cname CHAR(40),
Cpno CHAR(4),
Ccredit SMALLINT,
FOREIGN KEY(Cpno) REFERENCES Course(Cno)
);
例3.7 建立一个学生选课表SC
CREATE TABLE SC
(Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno),
FOREIGN KEY (Cno) REFERENCES Course(Cno)
);
例3.8 向Student表增加“入学时间”列,其数据类型为日期型
ALTER TABLE Student ADD S_entrance DATE;
[例3.9] 将年龄的数据类型由字符型改为整数。
ALTER TABLE Student ALTER COLUMN Sage INT;
例3.10 增加课程名称必须取唯一值的约束条件
ALTER TABLE Course ADD UNIQUE(Cname);
例3.11 删除Student表
和删除模式类似,也不能这样。
我们查询一下帮助文档
那么我们得首先删除那个外键:我们在sc里Sno参照了Student里的Sno,我们直接
ALTER TABLE SC DROP CONSTRAINT Sno;--错误的写法
这样是不行的,查了一下帮助文档
还是看不太懂,大概是FK_属性名_B,这个B还是不知如何获取,参考了一下博客大佬博客
使用了代码
select name
from sys.foreign_key_columns f join sys.objects o on f.constraint_object_id=o.object_id
where f.parent_object_id=object_id('SC')
找到了SC上的外键引用的名字,然后删除
ALTER TABLE SC DROP CONSTRAINT FK__SC__Sno__2C3393D0 ;
然后再删除表Student
DROP TABLE Student;
删除成功!
例3.12 若表上建有视图,使用RESTRICT时表不能删除;使用CASCADE时可以删除表,视图也自动删除。
首先我们创建视图IS_Student(当然上个实验我们删除了Student表,现在已经再次创建了)
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS';
然后删除!(和例题3.4 3.11一样,DROP操作不支持CASCADE。)
但是我们发现,虽然Select没有了,但是仍然存在,昨天晚上我一度以为是我操作错了,今天又试了一遍,还是这样。看来,标准sql里,使用CASCADE删除表时,视图也自动删除;但在T-SQL里,视图还留着。