首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有外键的表列可以为NULL吗?

带有外键的表列可以为NULL吗?
EN

Stack Overflow用户
提问于 2010-03-03 05:20:08
回答 7查看 280.5K关注 0票数 284

我有一个表,其中有几个ID列指向其他表。

我想要一个外键来强制完整性,如果我把数据放进去的话。如果我稍后执行更新以填充该列,那么它也应该检查约束。

(这可能与数据库服务器相关,我使用的是MySQL & InnoDB表类型)

我相信这是一个合理的预期,但如果我错了,请纠正我。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-03-03 05:37:11

可以,仅当值不为空时才能强制执行约束。可以通过以下示例轻松测试这一点:

代码语言:javascript
复制
CREATE DATABASE t;
USE t;

CREATE TABLE parent (id INT NOT NULL,
                     PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (id INT NULL, 
                    parent_id INT NULL,
                    FOREIGN KEY (parent_id) REFERENCES parent(id)
) ENGINE=INNODB;


INSERT INTO child (id, parent_id) VALUES (1, NULL);
-- Query OK, 1 row affected (0.01 sec)


INSERT INTO child (id, parent_id) VALUES (2, 1);

-- ERROR 1452 (23000): Cannot add or update a child row: a foreign key 
-- constraint fails (`t/child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY
-- (`parent_id`) REFERENCES `parent` (`id`))

第一个插入将通过,因为我们在parent_id中插入了一个NULL。第二次插入由于外键约束而失败,因为我们试图插入一个在parent表中不存在的值。

票数 297
EN

Stack Overflow用户

发布于 2012-12-19 15:25:30

我发现在插入时,null列值必须明确声明为NULL,否则将出现违反约束的错误(与空字符串相反)。

票数 39
EN

Stack Overflow用户

发布于 2010-03-03 05:29:40

是的,这将如您所期望的那样工作。不幸的是,我似乎很难在MySQL manual中找到关于这一点的明确声明。

外键表示该值必须存在于其他表中。NULL指值的缺失,因此当您将一列设置为NULL时,尝试对其施加约束是没有意义的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2366854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档