SQL笔记 --- 表完整性

表完整性

实体完整性

说明:

关系模型的实体完整性在 CREATE TABLE 中用 PRIMARY KEY 定义

违约处理:

  • 插入或对主码列进行更新操作时,RDBMS 按照实体完整性规则自动进行检查
  • 检查主码值是否唯一,如果不唯一则拒绝插入或修改
  • 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
  • 检查记录中主码值是否唯一的一种方法是进行全表扫描,由于对基本表进行全表扫描十分耗时的, RDBMS 核心一般都在主码上自动建立索引

定义:

  • 单属性构成的码有两种方法:
    • 定义为列级约束条件:
      CREATE TABLE Student(
      Sno CHAR(9) PRIMARY KEY,
      Sname CHAR(20) NOT NULL, 
      Ssex CHAR(2) ,
      Sage SMALLINT,
      Sdept CHAR(20));
    • 定义为表级约束条件:
      CREATE TABLE Student(
      Sno CHAR(9), 
      Sname CHAR(20) NOT NULL,
      Ssex CHAR(2) ,
      Sage SMALLINT,
      Sdept CHAR(20),
      PRIMARY KEY (Sno));
  • 对多个属性构成的码只有一种说明方法:
    • 定义为表级约束条件:

参照完整性

定义:

CREATE TABLE 中用 FOREIGN KEY 短语定义哪些列为外码用REFERENCES短语指明这些外码参照哪些表的主码

CREATE TABLE SC
(Sno CHAR(9) 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) 
/*在表级定义参照完整性*/
);

违约处理:

  • 拒绝(NO ACTION)执行:不允许该操作执行(默认策略)
  • 级联(CASCADE)操作:当删除或修改被参照表的一个组员造成了与参照表的不一致,则删除或修改参照表的所有造成不一致的元组
  • 设置为空值(SET-NULL):当删除或修改被参照表的一个组员造成了与参照表的不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空置

说明:

  • 对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值
  • 可能破坏参照完整性的情况

约束:

任何约束都有约束名

用户定义完整性

说明:

  • 用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求,由 RDBMS 提供,而不必由应用程序承担
  • 在CREATE TABLE时定义
    • 列值非空(NOT NULL)
    • 列值唯一(UNIQUE)
    • 检查列值是否满足一个布尔表达式(CHECK)
    • 设置默认值(DEFAULT)

类别:

  • NOT NULL:
    • 设置选项值不能为空(不能设置为表属性)
  • UNIQUE:
    • 唯一性约束用于指定一个或者多个列的组合的值具有唯一性,以防止在列中输入重复的值.当使用唯一性约束时,需要考虑以下几个因素:
      • 主键自动具有 unique 的特性
      • 一个表中可以允许有多个唯一性约束
      • 可以把唯一性约束定义在多个字段上
      • 唯一性约束用于强制在指定字段上创建一个唯一性索引
    • 可以设置为表属性
  • CHECK:
    • 用CHECK短语指定列值应该满足的条件:
      • 一个列级检查约束只能与限制的字段有关;一个表级检查约束只能与限制的表中字段有关.
      • 一个表中可以定义多个检查约束
      • 每个 CREATE TABLE 语句中每个字段只能定义一个检查约束
      • 在多个字段上定义检查约束,则必须将检查约束定义为表级约束
      • 当执行 INSERT 语句或者 UPDATE 语句时,检查约束将验证数据
  • DEFAULT:
    • 定义:
      • [constraint 约束名]
      • default 常量表达式 for 字段名
    • 注意:
      • 每个字段只能定义一个缺省约束
      • 如果定义的缺省值长于其对应字段的允许长度,那么输入到表中的缺省值将被截断
      • 不能加入到带有 IDENTITY 属性的字段上

违约处理:

  • 属性上的约束条件检查和违约处理
    • 插入元组或修改属性的值时,RDBMS 检查属性上的约束条件是否被满足如果不满足则操作被拒绝执行
  • 元组上的约束条件检查和违约处理
    • 插入元组或修改属性的值时,RDBMS 检查元组上的约束条件是否被满足如果不满足则操作被拒绝执行

完整性约束:

  • 定义约束:
    • CONSTRAINT 约束
      CONSTRAINT <完整性约束条件名>
      [ PRIMARY KEY短语
      |FOREIGN KEY短语
      |CHECK短语 ]
  • 删除表完整性约束:
  • ALTER TABLE Student
    DROP CONSTRAINT C3;
  • 修改表完整性限制:
    • 使用 ALTER TABLE 语句修改表中的完整性限制(可以先删除原来的约束条件,再增加新的约束条件)
  • ALTER TABLE Student
    DROP CONSTRAINT C3;
    ALTER TABLE Student
    ADD CONSTRAINT C3 CHECK (Sage < 40);

猜你喜欢

转载自my.oschina.net/fairy1674/blog/1811770