如何正确使用外键

时间:2011-06-26 21:52:01

标签: mysql sql foreign-keys

我正在开发一个类似帮助台的系统,我想使用外键,以确保数据库结构正常,但我不知道我是否应该使用它们,以及如何正确使用它们

是否有关于如何(以及何时)使用外键的好教程?

编辑我最困惑的部分是ON DELETE .. ON UPDATE ..部分,假设我有以下表格

table 'users'
id int PK auto_increment
department_id int FK (departments.department_id) NULL
name varchar

table 'departments'
id int PK auto_increment
name

users.department_id是来自departments.department_id的外键,当我想删除部门或用户时,ON UPDATE和ON DELETE功能如何在这里工作?

2 个答案:

答案 0 :(得分:5)

ON DELETEON UPDATE指的是您在密钥表中所做的更改如何传播到从属表。 UPDATE表示在依赖表中更改键值以保持关系,DELETE表示删除相关记录以保持完整性。

示例:假设您有

 Users: Name =  Bob, Department = 1
 Users: Name =  Jim, Department = 1
 Users: Name =  Roy, Department = 2

 Departments: id = 1, Name = Sales
 Departments: id = 2, Name = Bales

现在,如果您更改了deparments表以修改第一条记录以读取id = 5, Name = Sales,那么使用“UPDATE”,您还可以将前两条记录更改为Department = 5 - 而不使用“UPDATE”你不会被允许做出改变!

同样,如果你删除了部门2,那么使用“删除”你也会删除罗伊的记录!如果没有“删除”,你就不会在没有先删除Roy的情况下移除部门。

答案 1 :(得分:2)

如果要将数据库拆分为表并且正在使用DBMS(例如MySQL,Oracle等),则需要使用外键。我假设您使用的是MySQL。

如果您不使用外键,您的数据库将变得难以管理和维护。规范化过程可确保使用外键的数据一致性。

请参阅here for foreign keys.请参阅此处了解why foreign keys are important in a relational database here.

虽然效率是设计中的主要因素,但经常使用非规范化。如果是这种情况,你可能想要摆脱我告诉你的事情。

希望这有帮助。