MySql:为什么外键为空?

标签 mysql foreign-keys

我有两张 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 值。例如,如果我们要在 postuser_id 列上添加 NOT NULL 约束,那么实际上就是说 post 中不能存在行code> 如果它与 users 中的行无关。这是一种非常常见的模式。

关于MySql:为什么外键为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27965552/

相关文章:

mysql - 如何安全地在行中运行多个查询?

mysql - 当 'IN' 条件的所有值都没有结果时,SQL 选择默认值

mysql - 将 MySQL 表从 Latin1 转换为 UTF8 时整理丢失的信息

MySQL 使用外键创建架构抛出错误 1215

php - 如何合并 MySQL 表中的两条冗余记录,维护所有 PK/FK 关系?

mysql - openshift mysql 数据库模式创建脚本

php - 将项目插入序列化数组 mysql php

sql-server - 在外键列中设置空值?

mysql - 无法添加或更新子行 MySQL 错误 1452

mysql - 尝试获取模型时的递归循环