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