MySql: 为什么外键为空?

MySql: Why foreign key is null?

我有 2 个 table。 userspost。我想使用 users(id) 列(即 pk)作为 post(user_id) 列中的外键。我用过:

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

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

向 MySQL 中的任何列添加外键不会复制任何值。

问:为什么外键为空?

A: 列是否可以包含 NULL 值取决于是否存在 NOT NULL 约束。这完全独立于该列是否在外键约束中被引用。

列中的值为 NULL,因为这是插入行时分配的值。已分配该值,无论它是显式设置的还是从列的默认值派生的。 (如果该列已添加到现有 table,则新列中的值是该列的默认值。)

--

问:我是不是漏掉了什么东西?

A:您观察到的行为和结果完全符合我们的预期。

问: 它不应该从用户 table 复制 id 值吗?

A: 如果您询问 MySQL 是否应自动填充 post table 中的 user_id 列,这个问题的答案是否定的,不应该。

我想您可能已经了解了一个关键想法:

一个 table 中的一行与另一个 table 中的一行之间的 "relationship" 在关系数据库中通过存储公共值来表示。

但是数据库不知道哪一行与哪一行相关。你必须告诉它。您必须提供该信息。

当您在 post table 中插入一行时,您可以为 user_id 列提供一个值。您将提供一个等于 user.

中某行的 id 值的值

具有 FOREIGN KEY 约束的想法是它的限制。它只允许有效值。它可以防止存储无效值。 (对于 InnoDB 如果 FOREIGN_KEY_CHECKS=1 是这样,对于 MyISAM 则不是这样,因为 MyISAM 不强制执行外键约束。)

外键表示您想要"constrain"可以存储的值。它是说它不会允许 post 中的行具有指向 users table.[=26 中的 "missing" 行的 user_id 值=]

完全可以接受table 将 NULL 存储在外键列中。存储 NULL 值时,表示该行与 users table.

中的行 相关

不允许在列中使用 NULL 值是通过另一种约束实现的,即 NOT NULL 约束。

可以在同一列上同时定义 外键约束 NOT NULL 约束。这是一个设计决定,无论您是否要允许 NULL 值。在某些情况下,我们可能希望禁止在外键中使用 NULL 值。例如,如果我们要在 postuser_id 列上添加一个 NOT NULL 约束,这实际上是说如果该行与某行无关,则该行不能存在于 post 中在 users。这是一种非常常见的模式。