我有2张桌子。 users
和post
。我想在users(id)
列中使用post(user_id)
列(即pk)作为外键。我用过:
ALTER TABLE post ADD FOREIGN KEY (user_id) REFERENCES users(id);
并且该操作成功而没有任何错误,但我在null
列中仅看到(user_id)
。我会错过什么或什么?它不应该复制id
表中的users
值吗?
答案 0 :(得分:1)
问:为什么外键为空?
A:列是否可以包含NULL值取决于是否存在NOT NULL约束。这完全与列是否在外键约束中引用无关。
列中的值为NULL,因为这是插入行时分配的值。无论是显式设置还是从列的默认值派生,都会分配值。 (如果该列已添加到现有表中,则新列中的值是该列的默认值。)
-
问:我错过了什么或什么?
A:您观察到的行为和结果完全符合我们的预期。
问:不应该从用户表中复制id值吗?
答:如果你问MySQL是否应该自动填充user_id
表中的post
列,那么问题的答案是否定的,它不应该
我想也许你已经找到了一个关键的想法:
通过存储公共值,在关系数据库中表示一个表中的行与另一个表中的行之间的“关系”。
但是数据库不知道哪一行与哪一行相关。你必须告诉它。您必须提供该信息。
当您在post
表中插入行时,可以为user_id
列提供值。您将提供一个等于id
中某行的user
值的值。
FOREIGN KEY约束的想法是它的限制。它只允许有效值。它可以防止存储无效值。 (如果FOREIGN_KEY_CHECKS = 1,InnoDB也是如此,MyISAM不是这样,因为MyISAM不强制执行外键约束。)
外键表示您要“约束”可以存储的值。它说它不会允许post
中的行具有user_id
值,这些值指向users
表中的“缺失”行。
将NULL
存储在外键列中是完全可以接受的。当存储NULL
值时,表示该行不与users
表中的行相关。
禁止列中的NULL值使用不同类型的约束,即NOT NULL约束。
可以在同一列上定义两个外键约束和一个NOT NULL约束。这是一个设计决定,是否要允许NULL值。在某些情况下,我们可能希望禁止外键中的NULL值。例如,如果我们要在user_id
的{{1}}列上添加NOT NULL约束,那实际上就是说post
中的行不能存在,如果它与行无关在post
。这是一种非常普遍的模式。
答案 1 :(得分:-1)
将外键添加到MySQL中的任何列都不会复制任何值。