SQL 数据库完整性

时间:2014-06-05 05:17:25   收藏:0   阅读:411

作者 : 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.


SQL 数据库完整性,布布扣,bubuko.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!