MySQL中的自引用表字段

时间:2010-06-04 04:54:03

标签: sql mysql phpmyadmin

我有一个表,其中有一个“外键”引用自身。这将是非常有用的,除了我不确定如何将第一条记录添加到这样的表。无论我添加什么,我都无法为表本身提供有效的“外来”密钥,也没有条目。也许我没有正确地解决这个问题,但我希望这个表能够代表一直是其中的一员。有没有办法“引导”这样的表格,或其他方式进行自我引用?

2 个答案:

答案 0 :(得分:17)

一个选项是让您的字段NULL成功,并将根记录的父密钥设置为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)

答案 1 :(得分:2)

你可以这样做:

SET FOREIGN_KEY_CHECKS = 0;

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