数据定义包括
1.模式的定义与删除
2.基本表的定义、删除和修改
3.索引的建立与删除
该博客只介绍了前两个
↓
语句:
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
【例3.1】为用户WANG定义一个学生-课程模式S-T
1.首先要创建WANG这个用户
↓
①先创建一个数据库
CREATE DATABASE STU
刷新左侧一栏就会显示出来啦
②在左栏中 “STU(你所创立的数据库)—安全性—用户—右键新建”
2.输入语句:
CREATE SCHEMA "S-T" AUTHORIZATION WANG;
注:其中的S-T一定要加上引号啊,不然会出现错误的!
可是加上引号输入这句话还是会有以下错误↓
what!?我明明刚刚创建了wang这个用户,怎么还没有!!【口吐莲花】
幸亏我好好听课了,不然又要在这里跟它干耗一下午了,感谢老师!
元凶在此!!!
这里默认会是在master里面,而不是在我们刚刚建用户WANG的那个STU数据库里面,切换掉这里,再重新执行就OK啦!
锵锵锵~
它出现啦,它出现啦,它出现啦!(感觉自己疯疯癫癫,啰里啰嗦还望海涵)
【例3.2】
CREATE SCHEMA AUTHORIZATION WANG;
该语句建立模式的时候省去了模式名,那么模式名隐含为用户名。
敲黑板!!!
在SQL Server中,默认用户是dbo,如果我们没有创建模式,那么默认的模式都会是他!所以表名是dbo.*。
【例3.3】
为了省去用户ZHANG的建立,我们让刚建好的小WANG来代替他。
CREATE SCHEMA TEST AUTHORIZATION WANG;
CREATE TABLE TAB1 {COL1 SMALLINT,
COL2 INT,
COL3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2)
};
也可以用这种方式:
CREATE TABLE TEST.TAB2 {...}
注:如果前面没有加创建模式的语句,同样创建这张表的话,会默认为是dbo名下的,创建出来的表,它叫 dbo.TAB1(悄咪咪:就像是换了爹一样)
语句:
DROP SCHEMA <模式名> <CASCADE|RESTRICT>
其中
CASCADE——级联
删除模式的同时,将其下属的数据库对象全删掉了,相当于株连九族,连坐!!!慎用!!!
RESTRICT——限制
如果模式中有下属的数据库对象,就不可删除该模式。
(这两者必选其一)
【例3.4】
DROP SCHEMA WANG CASCADE;
采用级联方式,删除WANG模式,同时我们在WANG下定义的表TAB1也会被删除。
语句:
CREATE TABLE <表名>(<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]
...
[,表级完整性约束条件]);
其中
列级完整性约束条件——约束一列
表级完整性约束条件——约束多个属性列
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
/*列级完整性条件,表示学号是主码*/
Sname CHAR(20) UNIQUE,
/*列级完整性条件,表示名字取值唯一*/
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
因为建表时,没有指定模式,所以默认为dbo模式,建出来的表也就是这个样子滴~ dbo.Student
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,
是表级完整性约束条件,
表示外码及其引用*/
);
【例3.7】
注:这里的SC表必须在建立好Student,Course表之后才可建立,因为SC表中的Sno,Cno是外码,分别参照这两个关系。
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*/
/*以上三行均为表级完整性约束条件,放在表的最后*/
);
注:敲代码的时候一定不要忘记最后的 ); ,并且一定要是英文符号啊啊!(是我会犯的低级错误~)
(注:以上模式板块中没有修改模式定义这一项,是因为SQL标准不提供这一操作,包括修改视图定义也不提供)
语句:
ALTER TABLE <表名>
[ADD[COLUMN]<新列名><数据类型>[完整性约束]]
/*新增属性列和列级完整性约束*/
[ADD <表级完整性约束条件>]
/*新增表级完整性约束条件*/
[DROP [COLUMN] <列名> [CASCADE|RESTRICT]]
/*删除属性列*/
[DROP CONSTRAINT <完整性约束名>[RESTRICT|CASCADE]]
/*删除完整性*/
[ALTER COLUMN <列名><数据类型>];
/*修改原有列定义,包括列名和数据类型*/
ALTER TABLE Student ADD S_entrance DATE;
/*新增属性列名为S_entrance,数据类型为DATE日期型*/
注:不管基本表中是否有原有的数据,新增的一列都是空值。
【例3.9】
修改属性列的数据类型,用ALTER COLUMN。
ALTER TABLE Student ALTER COLUMN Sage INT;
这里不管修改之前的类型是什么,只需要指出修改之后的数据类型。
修改成功!!
ALTER TABLE Course ADD UNIQUE(Cname);
/*括号里为增加列级完整性约束条件的属性列*/
如果输入相同名字,会显示错误。(emmm,这里一看到名字就想到王五,恍惚之间才发现是课程名字。。。。)
(哇~ 一看到删除就全身发抖,我刚建好的小表表们又要遭殃了~)
语句:
DROP TABLE <表名> [RESTRICT|CASCADE];
/*默认为RESTRICT*/
DROP TABLE Student CASCADE;
采用CASCADE级联,不仅删除该基本表,引用该基本表的所有数据库对象等等都会被删掉。
SC表中的引用Student的Sno,所以SC表也会被删掉。
简直,无情!
【例3.12】
/*创建基于Student的视图IS_Student*/
CREATE VIEW IS_Student
AS
SELECT Sno,Sage,Sname
FROM Student
WHERE Sdept = 'IS';
/*再使用RESTRICT删除学生表*/
DROP TABLE Student RESTRICT;
/*(我爱RESTRICT,它删不掉我的表!!!)*/
会删除失败,因为在Student基本表上有视图IS_Student。
再来一遍??我???
DROP TABLE Student CASCADE;
CASCADE会连同Student上的视图,SC表都删掉。。。呜呜呜呜~
———————————————————————————
就到这里啦,剩余部分下次课后再来~