外键 - 他们为我做了什么?

Mar*_*ppi 8 mysql sql database database-design foreign-keys

我正在构建一个小应用程序并在表之间建立外键关系.但是我很困惑为什么我真的需要这个?有什么好处 - 在编写我不需要执行任何连接的查询时,它是否有助于我?这是我的数据库的示例片段:

+-------------------+
| USERS             |
+-------------------+
| user_id           |
| username          |
| create_date       |
+-------------------+

+-------------------+
| PROJECTS          |
+-------------------+
| project_id        |
| creator           |
| name              |
| description       |
+-------------------+
Run Code Online (Sandbox Code Playgroud)

之间有一个关键的关系users.user_idprojects.creator

我可以执行这样的查询吗?

SELECT * FROM PROJECTS WHERE USERS.username = "a real user";

既然MySQL应该知道表之间的关系吗?如果没有,那么数据库设计中外键的真正功能是什么?

OMG*_*ies 17

外键提供参照完整性.验证外键列中的数据 - 该值只能是外键中定义的表和列中已存在的值.它可以非常有效地阻止"坏数据" - 有人无法输入他们想要的任何内容 - 数字,ASCII文本等.这意味着数据已经标准化 - 重复值已被识别并隔离到他们自己的表中,因此不再需要关注关于处理文本中的区分大小写...并且值是一致的.这导致了下一部分 - 外键是用于将表连接在一起的内容.

您对用户拥有的项目的查询不起作用 - USERS当查询中没有对该表的引用时,您正在引用表中的列,并且在将其链接到PROJECTS表之前没有使用子查询来获取该信息.你真正使用的是:

SELECT p.*
   FROM PROJECTS p
   JOIN USERS u ON u.user_id = p.creator
WHERE u.username = 'John Smith'
Run Code Online (Sandbox Code Playgroud)


Fio*_*ite 5

基本上,他们不会给你任何更多的功能.它们会停止任何插入或更新,从而破坏数据模型的参照完整性.

我认为另一个关键方面是他们将数据模型传达给使用它的任何其他开发人员.我经常看一下表的外键,看看数据模型如何一目了然.

  • 我说数据验证是功能性的 - 外键约束就像是对steriods的CHECK约束.CHECK约束仅验证数据; 外键意味着除了数据验证之外,您还可以向该关系添加关联信息. (3认同)