MySQL中的自引用表字段

Posted

技术标签:

【中文标题】MySQL中的自引用表字段【英文标题】:Self-Referential Table Fields In MySQL 【发布时间】:2011-02-27 15:12:12 【问题描述】:

我有一个表,它有一个引用自身的“外键”。这将非常有用,除非我不确定如何将第一条记录添加到这样的表中。无论我添加什么,我都无法为表本身提供有效的“外来”键,还没有条目。也许我没有正确地解决这个问题,但我希望这张表代表的东西总是它自己的成员。有没有办法“引导”这样一个表,或者有另一种方法来进行自我引用?

【问题讨论】:

【参考方案1】:

你可以这样做:

SET FOREIGN_KEY_CHECKS = 0;

然后执行插入,然后将其设置回 1。它是一个会话变量,因此断开连接会重置它,并且不会影响其他连接。

【讨论】:

是的,您可以在 phpMyAdmin 中执行此操作。【参考方案2】:

一种选择是使您的字段NULL-able,并将根记录的父键设置为NULL

CREATE TABLE tb_1 (
   id       int   NOT NULL  PRIMARY KEY,
   value    int   NOT NULL,
   parent   int   NULL,
   FOREIGN KEY (parent) REFERENCES tb_1(id)
) ENGINE=INNODB;
Query OK, 0 rows affected (0.43 sec)

-- This fails:
INSERT INTO tb_1 VALUES (1, 1, 0);
ERROR 1452 (23000): A foreign key constraint fails.

-- This succeeds:
INSERT INTO tb_1 VALUES (1, 1, NULL);
Query OK, 1 row affected (0.08 sec)

否则,您仍然可以使用 NOT NULL 父键并将其指向根记录本身:

CREATE TABLE tb_2 (
   id       int   NOT NULL  PRIMARY KEY,
   value    int   NOT NULL,
   parent   int   NOT NULL,
   FOREIGN KEY (parent) REFERENCES tb_2(id)
) ENGINE=INNODB;
Query OK, 0 rows affected (0.43 sec)

-- This fails:
INSERT INTO tb_2 VALUES (1, 1, 0);
ERROR 1452 (23000): A foreign key constraint fails.

-- This succeeds:
INSERT INTO tb_2 VALUES (1, 1, 1);
Query OK, 1 row affected (0.08 sec)

【讨论】:

如果我使用第二种方法,(tb_2),我怎么能确定第三个参数使用什么数字? @Joshua:第三个参数和第一个参数一样(根记录)。即根记录的parent_id与其id相同。然后对于其他行,只需正常引用适当的parent_id @DanielVassallo 为了插入第一条记录而暂时禁用“NOT NULL”怎么样?可能吗?这对于简化递归查询而无需担心无限循环将非常有用。

以上是关于MySQL中的自引用表字段的主要内容,如果未能解决你的问题,请参考以下文章

mysql函数,如何引用表字段数据类型

mysql视图里面怎么新增一个全新字段,在原来表内没有这列

mysql查找字段在一个集合里存不存在

sequelize 中的引用字段是啥?

如何为所有行中所有字段中的所有表替换 MySQL 数据库中的字符串?

Django ManyToMany 字段上的自定义列名