完整性约束条件

路的好坏不在于崎岖多少, 只在于谁能最终达到目标。——申宝峰

完整性约束条件是对字段进行限制,要求用户对该属性进行的操作符合特定的要求。如果不满足完整性约束条件,数据库系统将不再执行用户的操作。

PRIMARY KEY (PK)

标识该字段为该表的主键,可以唯一的标识记录

FOREIGN KEY (FK)

标识该字段为该表的外键,是与之相联系的某表主键

NOT NULL

标识该字段不能为空

UNIQUE KEY (UK)

标识该字段的值是唯一的

AUTO_INCREMENT

标识该字段的值自动增长(整数类型,而且为主键)

DEFAULT

为该字段设置默认值

MySQL数据库系统不支持check约束,根据约束数据列限制,约束可分为单列约束和多列约束。主键可分为单字段和多字段主键。

外键约束FOREIGN KEY (FK):

外键约束为了保证多个表之间的参照完整性,即构建两个表的字段之间的参照关系。
例如,表示一个班级和学生的关系,即每个班级有多个学生。首先应该有两个表:班级表和学生表,然后学生表有个表示班级编号的字段classnum,其依赖于班级表的主键,这样的字段classnum就是学生表的外键,通过该字段班级表和 学生表建立了关系。
对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
在具体设置FK约束时,设置FK约束的字段必须依赖于数据库中已经存在的父表的主键,同时外键可以为空Null。
主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。

定义外键时,需要遵守下列规则:

  1. 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
    必须为主表定义主键。
  2. 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
  3. 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
  4. 外键中列的数目必须和主表的主键中列的数目相同。
  5. 外键中列的数据类型必须和主表主键中对应列的数据类型相同。

一、CASCADE:级联

(1)所谓的级联删除,就是删除主键表的同时,外键表同时删除。
(2)以上面的例子将就是,假如院系表中的某个院系被删除了,那么在学生表中要想查询这个被删除的院系号所对应的院信息就会报错,因为已经不存在这个系了,所以,删除院系表(主键表)时必须删除其他与之关联的表,这里就说明了外键的作用,保持数据的一致性、完整性。当然反过来讲,你删除学生表中的记录,并不影响院系表中的数据,你查询院系号也能正确查询。所以删除外键表中的数据并不影响主键表。

二、NO ACTION(非活动,默认)、RESTRICT:约束/限制

当取值为No Action或者Restrict时,则当在主键表中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除。(即外键表约束主键表)

三、SET NULL

当取值为Set Null时,则当在主键表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(,一样是外键表约束主键表,不过这就要求该外键允许取null)。

NO ACTION和RESTRICT的区别:只有在及个别的情况下会导致区别,前者是在其他约束的动作之后执行,后者具有最高的优先权执行。