1 CREATE TABLE SC( 2 Sno CHAR(5) , 3 Cno CHAR(3) , 4 Grade int, 5 Primary key (Sno, Cno)), 6 Foreign key (Sno) References Student(Sno), 7 Foreign key (Cno) References Course(Cno))
被参照方在参照完整性定义时需要做出更多的说明。
增强版:
1 CREATE TABLE SC( 2 Sno CHAR(5) , 3 Cno CHAR(3) , 4 Grade int , 5 Primary key (Sno, Cno)), 6 Foreign key (Sno) References Student(Sno) 7 ON DELETE CASCADE ON UPDATE CASCADE, 8 Foreign key (Cno) References Course(Cno) 9 ON DELETE NO ACTION ON UPDATE CASCADE)
NO ACTION----拒绝执行
CASCADE----连带修改
SC参照student,定义写在SC中。但是,起作用的却是在student上的操作。
发生在SC上的数据修改操作,如果引起问题,一律是 拒绝执行,可选项只是给 被参照方的
1 Foreign key (Sno) References Student(Sno) 2 ON DELETE CASCADE
上面的意思是:
SC的sno列 引用 student的sno列,当student的sno数值被删除的时候,比如删掉了一名学生,在student里。那么,会在SC里连带删除他的选课记录
实体完整性,参照完整性称为 关系数据库的 两个不变性
列值非空 列值唯一:UNIQUE;NOT NULL
取值范围:CHECK (Ssex in (‘Male’,‘Female’)) 离散取值范围,用了个关键词 check
1 CREATE TABLE Student ( 2 Sno CHAR(5) , 3 Sname CHAR(20) UNIQUE, 4 Ssex CHAR(2) NOT NULL, 5 Sage INT, 6 Sdept CHAR(15), 7 CHECK (Ssex in (‘Male’,‘Female’)), 8 CHECK (Ssex=‘Female’OR Sname NOT LIKE ‘MS.%’)); 9 PRIMARY KEY (Sno))
取值范围如果是 数值,也可以写成 Grade >=0 AND Grade <=100,表达一个区间
倒数第二句,这一句有两列Ssex和Sname。这一句表达的是两列之间的取值关系,字面意思是 Ssex=‘Female’或者 Sname NOT LIKE ‘MS.%’
p->q另一种形式是?not p or q
Ssex=‘male’-> Sname NOT LIKE ‘MS.%’
这个例子的主旨是用户定义完整性CHECK语句可以建立多列 之间的关联
另一个例子:
1 CREATE TABLE Teacher( 2 Tno CHAR(5) , 3 Tname CHAR(20) CONSTRAINT C1 NOT NULL, 4 Tsex CHAR(2) CONSTRAINT C2 CHECK (Tsex in (‘Male’, ‘Female’)), 5 Job CHAR(10) , 6 Sal INT, 7 Deduct INT, 8 PRIMARY KEY (Tno), 9 CONSTRAINT C3 CHECK (Sal + Deduct >=3000))
先关注这里 CHECK (Sal + Deduct >=3000),表示 表里任意一行 Sal列 + Deduct列 >=3000,这是一种双列取值范围的约束
1 ALTER TABLE Student ADD CONSTRAINT C2 CHECK (Sage BETWEEN 17 AND 25)
这里为Student添加了一条 完整性规则即 CHECK (Sage BETWEEN 17 AND 25),但是,不是在CREATE TABLE里加入的,而是已经有了Student表后边再把CHECK (Sage BETWEEN 17 AND 25)加进去
也可以删除掉
1 ALTER TABLE Student DROP CONSTRAINT C2
约束名重复会报错,
定义的时候没取名系统会自动赋一个名字,这个名字通过图形界面可以看见,当然,也可以通过DBMS提供的特殊函数,查看约束名字和内容,这些都属于DBMS的特有功能,不在SQL范围内
ALTER TABLE Student ADD CONSTRAINT能够执行成功的前提是student里现有的数据符合想要加入的 条件比如上边的例子。假如student里有人年龄16岁,和表里现有数据冲突,会执行不成功。