主键(PRIMARY KEY) 主键(PRIMARY KEY)”的完整称呼是“主键约束”,主键约束即在表中定义一个主键来唯一确定表中每 一行数据的标识符。主键可以是表中的某一列或者多列的组合,其中由多列组合的主键称为复合主键。主键 应该遵守下面的规则: • 每个表只能定义一个主键。 • 主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在两行数据有相同的主键值。这是 唯一性原则。 • 一个列名只能在复合主键列表中出现一次。 • 复合主键不能包含不必要的多余列。当把复合主键的某一列删除后,如果剩下的列构成的主键仍然满足唯 一性原则,那么这个复合主键是不正确的。这是最小化原则。
外键约束(FOREIGN KEY) MySQL 外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列。一个表可 以有一个或多个外键。 外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键的值必须等于另一个表中 主键的某个值。 外键是表的一个字段,不是本表的主键,但对应另一个表的主键。定义外键后,不允许删除另一个表中具有 关联关系的行。 外键的主要作用是保持数据的一致性、完整性。例如,用户表 tb_user 的主键是 id,在地址表 tb_address 中 有一个键 userid与这个 id 关联。 主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的 表就是主表。 从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的表就是从表。
定义一个外键时,需要遵守下列规则: • 外键要存在,首先必须保证表的引擎是 InnoDB(默认的存储引擎)。 • 父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一 个表,这样的表称为自参照表,这种结构称为自参照完整性。 • 必须为父表定义主键。 • 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键 中,这个外键的内容就是正确的。 • 在父表的表名后面指定列名或列名的组合。这个列或列的组合必须是父表的主键或候选键。 • 外键中列的数目必须和父表的主键中列的数目相同。 • 外键中列的数据类型必须和父表主键中对应列的数据类型相同。 • 如果外键约束模式选择SET NULL ,那么字段必须允许为NULL。