数据定义的相关操作
一、建立用户
在连接对象之后,建立一个新的数据库,起名为Test,在其路径下找到安全性→用户,右键,新建用户。
在显示的窗口中,输入新用户的用户名,并按照书中的例子填入登录名。点击确定,即创建好了一个新的用户。
二、例题
1.模式的定义与删除
①.为用户WANG定义一个学生-课程模式S-T
新建一个查询,输入以下语句:
Create Schema "S-T" Authorization WANG;
刷新资源管理器,就可以在架构中找到新建的"S-T"
②.输入CREATE SCHEMA AUTHORIZATION WANG;
该语句没有指定<模式名>,<模式名>隐含为<用户名>
在没有创建模式的情况下,默认的模式名为dbo,表名为dbo.*。
③.为用户WANG创建一个模式TEST,并且在其中定义一个表TAB1;然后继续建立表TAB2
新建查询,输入以下语句
CREATE SCHEMA TEST AUTHORIZATION WANG
CREATE TABLE TAB1(
COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2)
);--创建TAB1
GO--将查询分批进行
CREATE TABLE TEST.TAB2(
COL1 SMALLINT
);--创建TAB2
执行后:
我们可以看到,TAB1和TAB2都是在TEST模式下建立的表,这说明我们有两种方式在TEST模式下建表:
- 在建立模式后,不加分号,建立一张表
- 在要建立的表前加上TEST.
当不加TEST.时,TAB2被归于了默认模式dbo下
④.DROP SCHEMA TEST CASCADE;
当我们输入语句时,出现以下错误:
这是因为SQL Server不支持在删除过程中使用CASCADE/RESTRICT关键字
将其CASCADE删去后,依旧有错误显示:
这说明我们在删除TEST架构前,要先删除架构中创建的对象
DROP TABLE TEST.TAB1;
DROP TABLE TEST.TAB2;
DROP SCHEMA TEST;
2.基本表的定义、删除与修改
①.建立“学生”表Student。学号是主码,姓名取值唯一。
CREATE TABLE Student(
Sno CHAR(9) PRIMARY KEY,--主码
SNAME CHAR(20) UNIQUE,--约束,取唯一值
Ssex CHAR(2),
Sage SMALLINT,Sdept CHAR(20)
);
②.建立一个“课程”表Course
CREATE TABLE Course(
Cno CHAR(4) PRIMARY KEY,
Cname CHAR(40),
Cpno CHAR(4),
Ccredit SMALLINT,
FOREIGN KEY(Cpno) REFERENCES Course(Cno)
--Cpno是外码,被参照表是Course,被参照列是Cno
);
③.建立一个学生选课表SC
CREATE TABLE SC(
Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY (Sno,Cno),
--主码由两个属性构成,必须作为表级完整性进行定义
FOREIGN KEY (Sno) REFERENCES Student(Sno),
--表级完整性约束条件,Sno是外码,被参照表是Student
FOREIGN KEY (Cno)REFERENCES Course(Cno)
--表级完整性约束条件, Cno是外码,被参照表是Course
);
3.索引的建立与删除
①.向Student表增加“入学时间”列,其数据类型为日期型
ALTER TABLE Student ADD S_entrance DATE;
执行结果:
②.将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。
ALTER TABLE Student ALTER COLUMN Sage INT;
③.增加课程名称必须取唯一值的约束条件。
ALTER TABLE Course ADD UNIQUE(Cname);
④. 删除Student表
和例题4相同,SQL Server不支持在删除过程中使用CASCADE/RESTRICT关键字
而我们在例题7中,创建了一个引用Student的Sno为外码的SC表,所以我们无法直接删除Student
所以在删除Student前,要先删除SC中对于Sno的约束
使用如下SQL语句查询出表中外键约束名称:
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')
执行结果:
得到Sno的约束名后,输入下面的语句即可删除对Sno的约束
ALTER TABLE SC DROP CONSTRAINT FK__SC__Sno__5165187F
然后再执行如下语句即可删去Student表
DROP TABLE Student ;
⑤.若表上建有视图,选择RESTRICT时表不能删除;选择CASCADE时可删除表,视图自动被删除 。
与上一题类似,视图需手动删除,然后才能删除表
DROP VIEW View_1;--删除视图
三、总结
1.做实验的过程中有出现“无法删除xxxx,因为他不存在或您不具备相应的权限”的错误,虽然看着很难受,但是却可以正常执行查询。。。
2.在例题1.③中,不加GO会出现错误“CREATE SCHEMA 必须是批处理中仅有的语句”,所以要想运行一次完成架构与表的建立,需要加入GO语句进行分隔。
GO是批处理的终止符号,由于创建架构必须是查询批次中的第一个语句。所以你必须在后面加上GO,用于终止批处理。