【例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了。