本文利用SQL Server实现《数据库系统概论(第5版)》[例3.1]~[例3.12]
定义模式
新建数据库“Test20210322”,新建用户,设置用户名为“ZHANG”,登录名选择为第一个;
在SQL中,模式定义语句如下:
CREATE SCHEMA<模式名>AUTHORIZATION<用户名>;
- 1
[例3.1]为用户ZHANG定义一个学生-课程模式S-T。
CREATE SCHEMA "S-T" AUTHORIZATION ZHANG;
- 1
[例3.2]该语句没有指定<模式名>,所以<模式名>隐含为用户名ZHANG;
CREATE SCHEMA AUTHORIZATION ZHANG;
- 1
[例3.3]为用户ZHANG创建一个模式TEST,并且在其中定义一个表TAB1。
CREATE SCHEMA TEST AUTHORIZATION ZHANG
CREATE TABLE TAB1(
COL1 SMALLINT,
COL2 INT,
COl3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2)
);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
删除模式
在SQL中,删除模式语句如下:
DROP SCHEMA <模式名><CASCADE|RESTRICT>;
/*CASCADE是级联,表示在删除模式的同时把该模式中所有的数据库对象全部删除*/
/*RESTRICT是限制,表示如果模式中已经定义了下属的数据库对象,则拒绝该删除语句的执行。*/
- 1
- 2
- 3
[例3.4]该语句删除了模式ZHANG,同时,该模式中已经定义的TAB1也被删除了。
DROP SCHEMA ZHANG CASCADE;
- 1
但是当我在运行的时候出现了报错!!
经过查询之后发现是“SQL Server不支持在删除过程中使用CASCADE/RESTRICT关键字”
因此我将CASCADE删除
DROP SCHEMA ZHANG;
- 1
然后再一次的报错!!
提示TAB1正在引用它,经过查询资料之后发现在SQL Server中需要将TAB1对象删除。
DROP TABLE TEST.TAB1;
DROP SCHEMA TEST;
- 1
- 2
成功删除!!!所以在以后使用时记得“SQL Server不支持在删除过程中使用CASCADE/RESTRICT关键字”并且“在删除模式时需要将引用的表先删除”
基本表的定义、删除、修改
定义基本表
创建了一个模式就建立了一个数据库的命名空间,一个框架,在这个空间中首先定义的是该模式包含的数据库基本表。
SQL语言使用CREATE TABLE语句定义基本表,其基本格式如下:
CREATE TABLE<表名>(<列名><数据类型>[列级完整性约束条件] [<列名><数据类型>[列级完整性约束条件]] ... [,<表级完整性约束条件>]);/*表级写在最后*/
- 1
- 2
- 3
- 4
[例3.5]建立一个“学生”表Student。
CREATE TABLE Student(
Sno CHAR(9) PRIMARY KEY,/*列级完整性约束条件,Sno是主码*/
Sname CHAR(20) UNIQUE,/*Sname取唯一值*/
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
[例3.6]建立一个“课程”表Course。
CREATE TABLE Course(
Cno CHAR(4) PRIMARY KEY,/*列级完整性,不能取空值*/
Cname CHAR(40) NOT NULL,
Cpno CHAR(4),/*先修课*/
Ccredit SMALLINT,
FOREIGN KEY(Cpno) REFERENCES Course(Cno)/*表级完整性,Cpno为外码,参照Course表中的Cno列*/
);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
[例3.7]建立学生选课表SC。
CREATE TABLE SC(/*创建学生选课表*/
Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),/*表的完整性,主码由Sno和Cno构成*/
FOREIGN KEY(Sno) REFERENCES Student(Sno),/*表级完整性约束条件,Sno为外码,参照Student表*/
FOREIGN KEY(Cno) REFERENCES Course(Cno)/*表级完整性约束条件,Cno为外码,参照Course表*/
);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
修改基本表
[例3.8]向Student表增加“入学时间列”,其数据类型为日期型。
ALTER TABLE Student ADD S_entrance DATE;
- 1
[例3.9]将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。
ALTER TABLE Student ALTER COLUMN Sage INT;
- 1
[例3.10]增加课程名称必须取唯一值的约束条件。
ALTER TABLE Course ADD UNIQUE(Cname);
- 1
删除基本表
[例3.11]删除Student表;
DROP TABLE Student
- 1
在删除时再一次报错!!
提示该对象正由FOREIGN KEY约束引用
使用如下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')
- 1
- 2
- 3
然后将外键约束名删除:
ALTER TABLE SC DROP CONSTRAINT FK__SC__Sno__2B3F6F97
- 1
删除成功!!
[例3.12]若表上建有视图,选择RESTRICT时表不能删除;选择CASCADE时可以删除表,视图表也自动被删除。
CREATE VIEW IS_SC
AS
SELECT Sno,Cno,Grade
FROM SC
WHERE Sno='IS';
- 1
- 2
- 3
- 4
- 5
至此,例题3.1~3.12全部实现!在实践过程中删除部分出现了很多问题,SQL Server与课本中部分操作仍有区别,在使用时多查多看寻求帮助,问题都得以解决,感谢阅读~
文章来源: blog.csdn.net,作者:+51,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq_51776413/article/details/115099177