一尘不染

外键-他们为我做什么?

sql

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

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

+-------------------+
| PROJECTS          |
+-------------------+
| project_id        |
| creator           |
| name              |
| description       |
+-------------------+

两者之间存在关键关系usersuser_idprojectscreator

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

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

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


阅读 190

收藏
2021-03-10

共1个答案

一尘不染

外键提供引用完整性。外键列中的数据经过验证-该值只能是外键中定义的表和列中已经存在的值。这对于阻止“不良数据”非常有效-某人无法输入所需内容-
数字,ASCII文本等。这意味着数据已被规范化-
重复值已被识别并隔离到自己的表中,因此无需担心关于在文本中区分大小写的问题…并且值是一致的。这就引出了下一部分-外键是用于将表连接在一起的工具。

您对用户拥有的项目的查询将无法工作-USERS当查询中没有对该表的引用时,您将引用该表中的一列,并且在将其链接到PROJECTS表之前,没有子查询可用于获取该信息。您真正使用的是:

SELECT p.*
   FROM PROJECTS p
   JOIN USERS u ON u.user_id = p.creator
WHERE u.username = 'John Smith'
2021-03-10