在mysql中,表的字段是本表的外键,这该如何设置?

说实话,我在项目中实际上使用了你前面提到的场景,并且对于无关的密钥限制没有什么麻烦。
当时我们从事的是文档管理,层次文件夹关系复杂,依靠外键来琐碎。

使用文件夹字段作为主键没有任何问题。
int(1 1 ) 的大小足够了。
将默认值设置为 0 有点离谱——想想看,如果有人将 0 作为父项填写,系统就会爆炸。
我建议将其更改为 NULL,或者干脆将其留空以让数据库自动增长。
但看看你的例子,你可能想预留空间来手动插入数据,这个想法也可行。

Partfolderid 转换为 int(1 1 ) 以引用文件夹 ID。
这一步很关键。
约束名称“FK__1 ”是相当随机的。
我通常使用“fk_folder_parent”,因为它看起来更好。
但是MySQL会拿出来的命名规则确实可以省事,但是太陌生了。

给我印象最深的是数据输入的验证。
例如,如果要插入一个子文件夹,其parentfolderid为1 2 3 ,但parent不是主表中1 2 3 的文件夹,MySQL会直接报错:“在父表中找不到匹配的行”。
这个需要提前想好,不然程序里会有验证,或者使用DE DELETE CASCADE之类的策略。
例如,如果删除父文件夹,则子文件夹将被一起删除。
此操作非常危险,请谨慎使用。

添加有趣的外键控制层锁。
您是否尝试过同时将两个线程的数据写入相关表?我陷入了僵局,系统卡住了很长时间。
当时查了日志,发现是外键导致的,于是就修改了碰撞设计的设计。

接下来我们添加了文件夹名称字段并将其设为 VARCHAR(2 5 5 ) 并使用 DATABASE 作为创建时间。
这个组合运作得非常顺利。
由于数据量很小,这种简单的结构运行速度非常快。
但如果文件夹嵌套得太高,例如超过 1 0 层,则可能会出现性能问题。
这时,你应该考虑其他策略,例如父轨道数据冗余。

就数据完整性而言,我建议使用触发器并添加另一个验证表。
例如,为了防止某人将现有子文件夹的 ID 更改为不存在的父文件夹,仅靠外部约束有时是不够的。
当时有一个客户为这个请求写了几百行触发器。

归根结底,外键是数据库层面的约束,但在实际应用中必须结合业务逻辑。
文件夹概念的目的很明确,但在实施这些条款时需要小心。
当我最近改造一个类似的系统时,我花了两天时间把所有与外键相关的约束都跑遍了,生怕错过了。

MySQL怎样设置外键约束 外键关联与级联操作实战教学