mysql - 一个字段中的主键和外键

标签 mysql sql

我有 3 个表:userspagesusers_pages

Users Table
+----+------+-----
| id | name | ...
+----+------+-----

Pages Table
+----+------+-----
| id | name | ...
+----+------+-----

users_pages table, which says, which user is admin of which page.
+---------+---------+
| user_id | page_id |
+---------+---------+
|    1    |    1    |  // means, user 1 is admin of page 1
+---------+---------+

users_pages表中,user_idpage_id的组合是一个复合键(主键)
是否可以将 user_idpage_id 定义为外键,而它们一起是主键?

最佳答案

是的,当然。您没有提到您使用的是哪种关系数据库,但这是常见做法,并且在我所知道的所有关系数据库中都是允许的。

我的额外解释尝试:-

主键和外键更像是“理论”事物,而不是硬物理事物。在查看具体细节时,我发现仅考虑索引约束而不是“键”本身是很有用的

这样想,“主键”实际上是两个独立事物的组合:-

  1. 一个独特的约束。这会检查并拒绝任何尝试 创建副本。
  2. 基于字段的索引。这只是让 如果您使用该字段查看,检索记录会快得多 向上(从表中选择 *,其中 pkey = 'x')

“外键”在实践中只是一种约束,与唯一键约束没有太大区别。它检查其他表中是否存在记录,并拒绝任何创建在所引用表中没有相应条目的记录的尝试。

没有理由不能在同一个字段上有多个约束(它既是唯一的又存在于另一个表中),并且表上的任何索引都不会阻止您添加任何您喜欢的约束。因此,将相同的字段作为主键的一部分是没有问题的,它也有外键约束。

关于mysql - 一个字段中的主键和外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20803452/

相关文章:

mysql - 对于以下情况,正确的模式是什么?

php - 使用括号使用 mysql 查询未检索到正确的结果

php - 记录不更新

MySQL 删除重复项

mysql - 了解 LEFT OUTER JOIN 的结果

sql - 连接具有两个任务列表和用户列表的表

mysql - SQL查询多对多JOIN中存在的多个关系

mysql - SQL 求和和计数命令。如何对表格内容进行分组以输出两组(行)结果?

php - Mysql 选择不带货币的数字价格范围字段

sql - Postgresql:是否需要在作为复合唯一约束一部分的列上定义单列索引?