[英]MySql: Why foreign key is null?
我有2张桌子。 users
和post
。 我想将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
列,那么该问题的答案是否定的,不是。
我认为您可能已经想到了一个关键想法:
关系数据库中通过存储一个公共值来表示一个表中的行与另一表中的行之间的“关系”。
但是数据库不知道哪一行与哪一行有关。 你必须告诉它。 您必须提供该信息。
在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约束,那实际上就是说,如果与users
的一行不相关,则该行不能存在于post
中。 这是非常常见的模式。
将外键添加到MySQL中的任何列不会复制任何值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.