作者 : Dolphin
原文地址:http://blog.csdn.net/qingdujun/article/details/27109035
一、实体完整性定义
[例1]将Student表中的Sno属性定义为码。
CREATE TABLE Student ( Sno CHAR(10) PRIMARY KEY, /*在列定义主码*/ Sname CHAR(20) NOT NULL, Sage SMALLINT );
或者:
CREATE TABLE Student ( Sno CHAR(10), Sname CHAR(20) NOT NULL, Sage SMALLINT, PRIMARY KEY(Sno) /*在表级定义主码*/ );
[例2]将SC表中的Sno,Cno属性组定义为码。
CREATE TABLE SC ( Sno CHAR(10) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT, PRIMARY KEY(Sno,Cno) /*只能在表级定义主码*/ );
二、参照完整性
[例3]定义SC中的参照完整性
CREATE TABLE SC ( Sno CHAR(10) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT, PRIMARY KEY(Sno,Cno), /*只能在表级定义主码*/ FOREIGN KEY(Sno) REFERENCES Student(Sno), /*在表级定义参照完整性*/ FOREIGN KEY(Cno) REFERENCES Course(Cno) /*在表级定义参照完整性*/ );
[例4]显示说明参照完整性的违约处理示例。
CREATE TABLE SC
(
Sno CHAR(10) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno), /*只能在表级定义主码*/
FOREIGN KEY(Sno) REFERENCES Student(Sno) /*在表级定义参照完整性*/
ON DELETE CASECADE /*当删除时,级联*/
ON UPDATE CASECADE, /*当更新时,级联*/
FOREIGN KEY(Cno) REFERENCES Course(Cno) /*在表级定义参照完整性*/
ON DELETE NO ACTION /*当删除时,拒绝*/
ON UPDATE CASECADE /*当更新时,级联*/
);
三、用户定义完整性
[例5]在定义SC表时,说明Sno,Cno,Grade属性不允许取空值。
CREATE TABLE SC ( Sno CHAR(10) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT NOT NULL, PRIMARY KEY(Sno,Cno) /*只能在表级定义主码*/ /*如果定义了试题完整性,即主键,则隐含Sno,Cno不能取空*/ );
[例6]建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码。
CREATE TABLE DEPT ( Deptno NUMERIC(2), Dname CHAR(9) UNIQUE, /*要求Dname列值唯一*/ Location CHAR(10), PRIMARY KEY(Deptno) /*在表级定义主码*/ );
[例7]Student表的Ssex只允许取"男"或"女"。
CREATE TABLE Student
(
Sno CHAR(10) PRIMARY KEY, /*在列定义主码*/
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) CHECK (Ssex IN ('男','女')), /*性别属性Ssex只允许取'男'或'女'*/
Sage SMALLINT
);
[例7]SC表的Grade的值应该在0和100之间。
CREATE TABLE SC ( Sno CHAR(10) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT CHECK(Grade >= 0 AND Grade <= 100), PRIMARY KEY(Sno,Cno) /*只能在表级定义主码*/ /*如果定义了试题完整性,即主键,则隐含Sno,Cno不能取空*/ FOREIGN KEY(Sno) REFERENCES Student(Sno), FOREIGN KEY(Cno) ENFERENCES Course(Cno) );
[例9]当学生性别是男时,其名字不能以Ms.打头。
CREATE TABLE Student ( Sno CHAR(10) PRIMARY KEY, /*在列定义主码*/ Sname CHAR(20) NOT NULL, Sage SMALLINT, Ssex CHAR(2), CHECK(Ssex='女' OR Sname NOT LIKE 'Ms.%') /*定义了元组中Sname和Ssex两个属性值之间的约束条件*/ );
四、完整性约束命名子句
[例10]建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是"男"或"女"。
CREATE TABLE Student
(
Sno NUMERIC(6)
CONSTRAINT C1 CHECK(Sno BETWEEN 90000 AND 99999),
Sname CHAR(20)
CONSTRAINT C2 NOT NULL,
Sage NUMERIC(3)
CONSTRAINT C3 CHECK(Sage < 30),
Ssex CHAR(2)
CONSTRAINT C4 CHECK(Ssex IN('男','女')),
CONSTRINT StudentKey PRIMARY KEY(Sno)
);
[例12]去掉[例10]中Student表中对性别的限制。
ALTER TABLE Student DROP CONSTRAINT C4;
[例13]修改表Student中的约束条件,要求学号改为在1000~9999之间。
ALTER TABLE Student DROP CONSTRAINT C1; ALTER TABLE Student ADD CONSTRAINT C1 CHECK(Sno BETWEEN 1000 AND 9999);
参考文献:王珊,萨师煊.数据库系统概论(第4版) [M].北京:高等教育出版社,2006.152-160.
duplicate报ORA-01017权限问题,布布扣,bubuko.com
原文:http://blog.csdn.net/wuweilong/article/details/27113867