一个领域的PRIMARY和FOREIGN键

时间:2013-12-27 15:43:26

标签: 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 个答案:

答案 0 :(得分:3)

是的,绝对。你没有提到你正在使用哪个关系数据库,但这是常见的做法,并且在我所知道的所有关系数据库中都是允许的。

我尝试了另外的解释: -

主键和外键更像是“理论”的东西而不是硬物理的东西。在查看螺母和螺栓时,我发现只考虑索引约束,而不是“密钥”本身是有用的

以这种方式思考“主键”实际上是两个独立事物的组合: -

  1. 独特禁令。这会检查并拒绝任何尝试 创建重复项。
  2. 基于该字段的索引。这只是做 如果您使用该字段来查找记录,则检索记录要快得多 它(从表中选择*,其中pkey ='x')
  3. 实践中的“外键”只是一种约束,与独特的关键约束没有多大区别。它检查另一个表中是否存在记录,并拒绝任何尝试创建在引用表中没有相应条目的记录。

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