翻阅Bill Karwin的《 QL Antipatterns》一书,第3章,朴素树(邻接表,父子关系),其中有一个注释表的示例。
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鈥檚 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和comment列。parent_id是引用comment_id的外键。
comment_id自动从1开始递增。
问题。
如果假定parent_id是引用comment_id的外键,那么当具有外键的目的是确保引用完整性时,comment_id =
1的行的parent_id为null / 0。
注意:我按原样创建了表格,并尝试输入数据并收到此错误
#1452-无法添加或更新子行:外键约束失败(“ category..comments
,CONSTRAINT
comments_ibfk_1FOREIGN KEY(
parent_id)参考” comments
(comment_id
))
从此CW答案的以上评论中收集一些结论。
的parent_id
是NULL
在此表中为“根”节点,该节点是在树的顶部,并因此没有父。
阅读https://dev.mysql.com/doc/refman/5.7/en/null-values.html:请注意,该NULL
值不同于数字类型的值,例如0或字符串类型的空字符串。欲了解更多信息,请参见`[价值](https://dev.mysql.com/doc/refman/5.7/en/problems-with-null.html)[问题
NULL`](https://dev.mysql.com/doc/refman/5.7/en/problems-with-null.html)’‘一节。
另请注意,关键字NULL
与带有单词的文字字符串不同'NULL'
。
阅读https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html:在MySQL中,它SERIAL
是的别名BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
。
问题内容: MySQL是否自动索引外键列? 问题答案: 是的,但仅在innodb上。Innodb是当前唯一实现了外键的表格式。
问题内容: 一般来说,我对Web应用程序和数据库内容还是陌生的,所以这可能是一个愚蠢的问题。我想制作一个模型(“ CategoryModel”),其字段指向模型的另一个实例(其父实例)的主ID。 我该怎么做呢?谢谢! 问题答案: 你可以将模型名称作为字符串传递给ForeignKey,这将做正确的事情。 所以: 或者你可以使用字符串“ self”
问题内容: 我有一个带有主键id和外键f的表T。将f指定为外键时是否自动为其编制索引?我是否需要显式添加f的索引? 问题答案: 没有创建索引,所以是的,您需要添加显式添加索引。 编辑添加… 我可能应该补充一点,表T中数据的源表/列必须具有唯一索引。如果尝试对不是唯一索引的列(无论是作为PK还是具有UNIQUE约束)创建FK,则无法创建FK。
问题内容: 我拼凑了一个图片网站。基本模式是非常简单的MySQL,但是在尝试表示与图像相关联的可能的管理标志(“不合适”,“受版权保护”等)时遇到了一些麻烦。我目前的概念如下: (为了方便阅读而被截断;我发誓要搭配各种外键和索引) 在标志类型的查找表上是外键,并且您可以想象 应该 在上外键。现在的问题是,当第一次发出标志时,没有逻辑解析类型(我将其声明为的一种很好的用法)。但是,如果设置了值,则应
问题内容: 我有一个MySQL表,其定义如下: 目前表格中只有1列: 问题是没有删除约束就无法删除该行的方法。 由于ThreadId列的定义不为null,因此也无法将ThreadId临时设置为其他值以删除该行。有没有一种方法可以删除行而不更改表的定义或删除整个表? 问题答案: 您可以使用以下查询临时禁用外键约束:
问题内容: 您需要显式创建索引,还是在定义主键时隐式创建索引?MyISAM和InnoDB的答案是否相同? 问题答案: 主键始终被索引。对于MyISAM和InnoDB,这是相同的,并且通常对所有支持索引的存储引擎都是如此。