MySql:为什么外键是null?

时间:2015-01-15 14:23:45

标签: mysql foreign-keys

我有2张桌子。 userspost。我想在users(id)列中使用post(user_id)列(即pk)作为外键。我用过:

ALTER TABLE post ADD FOREIGN KEY (user_id) REFERENCES users(id);

并且该操作成功而没有任何错误,但我在null列中仅看到(user_id)。我会错过什么或什么?它不应该复制id表中的users值吗?

2 个答案:

答案 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中的任何列都不会复制任何值。