Navicat For MySQL--外键建立与cannot add foreign key constraint分析

1.主键

主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。
作用:
1)保证实体的完整性;
2)加快数据库的操作速度
3) 在表中添加新记录时,DBMS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。
4) DBMS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。

2.外键

什么是外键?如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。

3.主键外键的作用

  1. 为了维护关系数据库的完整性:
    主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
    外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。

  2. 起约束作用:
    外键取值规则:空值或参照的主键值。
    (1)插入非空值时,如果主键表中没有这个值,则不能插入。
    (2)更新时,不能改为主键表中没有的值。
    (3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。
    (4)更新主键记录时,同样有级联更新和拒绝执行的选择。

4.Navicat For MySQL如何定义外键

要在Mysql数据库平台建立外键关联,必须满足以下几个条件:
 1. 两个表必须为 InnoDB 类型。
 2. 外键和被引用键必须是索引中的第一列,InnoDB不会自动为外键和被引用键建立索引,必须明确创建
     它们。
 3. 外键与对应的被引用键在 InnoDB 内必须有相似的内部数据类型,以便他们不需要一个类型转换就可
     以进行比较。整型字段的长度与有符号类型必须一致。 字符型则不需要一致。如果指定了一个SET
   NULL 动作,那你必须要确定子表中的对应字段没有定义为 NOT NULL

设置外键时,删除和更新两列的均有四个选项:
CASCADE:父表delete、update的时候,子表会delete、update掉关联记录;
SET NULL:父表delete、update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null;
RESTRICT:如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录;
NO ACTION:同 RESTRICT,也是首先先检查外键;

5.Navicat For MySQL定义的表

职位表hrm_job:主键是id

部门表hrm_dept:主键是id

员工表hrm_employee:主键是id,外键是dept_id和job_id

6.参考资料

主键:
https://blog.csdn.net/ytm15732625529/article/details/53729155
https://www.cnblogs.com/PyLearn/p/7624768.html

外键:
http://www.cnblogs.com/chenxiaohei/p/6909318.html
https://www.cnblogs.com/bhlsheji/p/5332910.html

posted on 2018-09-20 01:52  粤B_Liao  阅读(1214)  评论(0编辑  收藏  举报

导航