通过Bill Karwin的书“SQL Antipatterns”,第3章,Naive Trees(邻接表,亲子关系),有一个评论表的例子。
CREATE TABLE Comments (
comment_id SERIAL PRIMARY KEY,
parent_id BIGINT UNSIGNED,
comment TEXT NOT NULL,
FOREIGN KEY (parent_id) REFERENCES Comments(comment_id)
);
示例数据
| comment_id | parent_id | comments
|------------| ----------|-------------------------------------
|1 | NULL |What’s the cause of this bug?
|2 | 1 |I think it's a null pointer
|3 | 2 |No, I checked for that
|4 | 1 |We need to check for invalid input
|5 | 4 |Yes,that's a bug
|6 | 4 |Yes, please add a check
|7 | 6 |That fixed it
该表有一个comment_id,parent_id和一个注释列。 parent_id是引用comment_id的外键。
comment_id自动增量从1开始。
问题。
如果parent_id应该是引用comment_id的外键,那么当具有外键的目的是确保引用完整性时,具有comment_id = 1的行如何具有parent_id null / 0。
注意:我按原样创建了表,并尝试输入数据并收到此错误
#1452 - 无法添加或更新子行:外键约束失败(`category``comments`,CONSTRAINT`Reviews_ibfk_1` FOREIGN KEY(`parent_id`)REFERENCES`comment`(`comment_id`))< / p>
答案 0 :(得分:3)
从CW答案中的上述评论中收集一些结论。
此表中的parent_id
为NULL
,表示“根”节点,该节点位于树的顶部,因此没有父节点。
读取https://dev.mysql.com/doc/refman/5.7/en/null-values.html:请注意,NULL
值与数值类型的值(如0)或字符串类型的空字符串不同。有关更多信息,请参见“Problems with NULL
Values”部分。
另请注意,关键字NULL
与带有'NULL'
字词的文字字符串不同。
阅读https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html:在MySQL SERIAL
中是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
的别名。