概念
外键是我们经常使用的数据库约束方式。它保证了子表上的特定索引列取值一定与父表列(主键列)相一致对应。而且保证在子表没有对应子记录的情况下,父表数据才能删除。应该说,外键是实现数据库完整性、消除潜在脏数据风险的重要手段。
在使用外键的时候,我们经常会要求在子表外键列上建立索引。
如下图,在admin表里建立外键,并设置参考(phpmyadmin里叫做链接到)表的字段为 删除时 NO ACTION时,是指
当参考(链接到)的表发生删除操作时,如果admin表存在和user表里字段相等的记录,则禁止参考的表进行删除操作。
但如果是删除admin表里的记录,user表如果没有对应约束的话,则会删除admin里的记录,user表里的记录不受影响
其关系类似父子关系,外键参考的表属于父亲,当前外键的表属于孩子,删除时孩子不会对父亲产生影响。
另外,当更新(ON UPDATE)约束如果没有设置时,默认为RESTRICT(phpmyadmin不显示),如果想在admin表里直接插入一条user里没有记录的记录,则会提示“can not add or delete a child row”错误,即当添加数据时,参考的表里必须有对应的记录才可操作。
从以上关系可以推断出 外键约束 不能双向约束,只能单向,比如,如果想实现user表里删除记录时对应删除admin表,同时删除admin表记录时对应删除user表中的记录,是不可能的
使用
一个表里多个字段对参考表里同一字段建立外键关联貌似不可用
外键的使用有利有弊,好处是可以减轻数据库垃圾的产生,弊端是需要特定数据库支持,带来移植不便,再就是一些确实需要约束的关联不能简单的通过mysql自己实现,必须要在业务上进行提示处理,比如删除一个栏目时,栏目下的文章不能简单的通过外键约束全部删除,必须要手动处理。