【2020-2021春学期】数据库作业3:数据定义语句例题练习

【例3.1】为用户WANG定义一个学生-课程模式S-T

create schema "S-T" authorization WANG;

注: 双引号并不是可加可不加的,这里是因为减号被默认为了运算符号而不是字符。在正常情况下是可以省略的。

【例3.2】若例3.1中语句没有指定<模式名>,<模式名>隐含为<用户名>

CREATE SCHEMA AUTHORIZATION WANG;

注: 这是标准SQL语句的用法,而SQL server中用的是T-SQL,并不支持这种语句,官方文档如下:

当前支持不指定架构名称的 CREATE SCHEMA 语句,目的是为了向后兼容。 此类语句并不在数据库中实际创建架构,但它们会创建表和视图,并授予权限。 主体不需要 CREATE SCHEMA 权限来执行这一早期形式的 CREATE SCHEMA,因为不会创建任何架构。 此功能将从 SQL Server 的未来版本中删除。
————
https://docs.microsoft.com/zh-cn/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-ver15#deprecation-notice

【例3.3】为用户WANG创建了一个模式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)
				  );

注: 若去掉第一行,则新建的表为dbo.TAB1

【例3.4】删除模式TEST

DROP SCHEMA TEST CASCADE

这里T-SQL和标准SQL又有些区别,它不支持 DROP SCHEMA使用CASCADE。如果不写又会提示:无法对 ‘TEST’ 执行 drop schema,因为对象 ‘TAB1’ 正引用它。因此就必须要先把TAB1先删除再删除模式TEST。

DROP TABLE TEST.TAB1;
DROP SCHEMA TEST;

—— 创建基本表的基本格式:——

CREATE TABLE <表名>(<列名> <数据类型>[ <列级完整性约束条件> ]
      			    [,<列名> <数据类型>[ <列级完整性约束条件>] ][,<表级完整性约束条件> ] );

<表名>:所要定义的基本表的名字
<列名>:组成该表的各个属性(列)
<列级完整性约束条件>:涉及相应属性列的完整性约束条件
<表级完整性约束条件>:涉及一个或多个属性列的完整性约束条件
如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。

【例3.5】建立一个“学生”表Student。

create table Student
	(Sno char(9) primary key, --主码
	Sname char(20) unique, --唯一约束
	Ssex char(2),
	Sage smallint,
	Sdept char(20)
	);

【例3.6】建立一个“课程”表Course

create table Course
	(Cno char(4) primary key,  --Cno是主码
	Cname char(40) not null,  --Cname不能取空值
	Cpno char(4),  --Cpno含义是先修课
	Ccredit smallint,
	foreign key(Cpno) references Course(Cno) --Cpno是外码,被参照表是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),  /* 表级完整性约束条件,Sno是外码,被参照表是Student */
          FOREIGN KEY (Cno)REFERENCES Course(Cno)  /* 表级完整性约束条件, Cno是外码,被参照表是Course*/
        ); 

—— 修改基本表的基本格式:——

ALTER TABLE <表名>
[ ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
[ ADD <表级完整性约束>]
[ DROP [COLUMN] <列名> [CASCADE| RESTRICT] ]
[ DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
[ALTER COLUMN <列名><数据类型> ] ;

<表名>是要修改的基本表
ADD 用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件
DROP COLUMN 用于删除表中的列
DROP CONSTRAINT 用于删除指定的完整性约束条件
ALTER COLUMN 用于修改原有的列定义,包括修改列名和数据类型
如果指定了CASCADE短语,则自动删除引用了该列的其他对象
如果指定了RESTRICT短语,则如果该列被其他对象引用,关系数据库管理系统将拒绝删除该列

【例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表

DROP TABLE Student CASCADE;
-- 因SQLserver不支持CASCADE/RESTRICT关键字,直接如下删除即可
DROP TABLE Student;

【例3.12】若表上建有视图,选择RESTRICT时表不能删除;选择CASCADE时可删除表,视图自动被删除

标准SQL应如下:

CREATE VIEW IS_Student  --Student表上建立视图
	AS
	SELECT Sno,Sname,Sage
	FROM Student 
	WHERE Sdept='IS';
	
	DROP TABLE Student RESTRICT; 
	--ERROR: cannot drop table Student because other objects depend on it  --因存在依赖关系,不能被删除

	DROP TABLE Student CASCADE;
	--NOTICE: drop cascades to view IS_Student  --系统提示视图已被删除

	SELECT * FROM IS_Student;
	--ERROR: relation " IS_Student " does not exist --包括视图确实删除了

但在SQL server中直接使用DROP TABLE Student;会报错
在这里插入图片描述
这时可以使用下面的语句找出外码再单独删除

exec sp_helpconstraint 'Student'

在这里插入图片描述

alter table SC drop constraint FK__SC__Sno__412EB0B6

再次运行删除Student表语句

DROP TABLE Student;

在这里插入图片描述
检查一下

SELECT *FROM IS_Student

在这里插入图片描述

删除成功!但从提示来看IS_Student的存储空间并没有被抹去,而是找不到student了。

猜你喜欢

转载自blog.csdn.net/jiashiqihh/article/details/115070899