数据库表列中的外键和 NULL 值
在数据库设计中,外键约束通常用于通过强制执行表之间的关系来确保数据的完整性。但是,问题出现了:具有外键的表列是否允许保存 NULL 值?
如所提供的问题所示,可能存在仅在显式设置值时才需要强制执行外键约束的情况。这允许在最初在外键列中插入具有 NULL 值的记录,同时在填充值后确保数据完整性。
在 MySQL 和 InnoDB 表类型中,确实可以拥有允许 NULL 值的非 NULL 外键。以下示例演示了这一点:
<code class="language-sql">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;</code>
允许将具有 parent_id
为 NULL 值的记录插入到 child
表中:
<code class="language-sql">INSERT INTO child (id, parent_id) VALUES (1, NULL);</code>
但是,尝试插入 parent_id
值在 parent
表中不存在的记录会导致外键约束冲突:
<code class="language-sql">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`))</code>
此行为证实 MySQL 和 InnoDB 允许外键列为 NULL 值,并且仅在提供非 NULL 值时才强制执行约束。这符合在外键列填充数据时应强制执行外键约束的预期,同时允许在外键列中使用初始 NULL 值。
以上是MySQL InnoDB 中外键列可以接受 NULL 值吗?的详细内容。更多信息请关注PHP中文网其他相关文章!