gpt4 book ai didi

MySql:为什么外键为空?

转载 作者:行者123 更新时间:2023-11-29 23:13:31 25 4
gpt4 key购买 nike

我有两张 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com