Поля Самореферентной Таблицы В MySQL


У меня есть таблица, в которой есть "внешний ключ", ссылающийся на себя. Это было бы очень полезно, за исключением того, что я не уверен, как добавить первую запись в такую таблицу. Независимо от того, что я добавляю, я не могу предоставить действительный "внешний" ключ к самой таблице, поскольку в ней еще нет записей. Может быть, я не совсем правильно это понимаю, но я хочу, чтобы эта таблица представляла собой нечто, что всегда является частью самого себя. Есть ли способ "загрузиться" с такой таблицей или другой способ перейти к самостоятельной ссылке?

Author: Michael Petrotta, 2010-06-04

2 answers

Один из вариантов - сделать ваше поле 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)
 12
Author: Daniel Vassallo, 2010-06-04 05:09:32

Вы могли бы сделать:

SET FOREIGN_KEY_CHECKS = 0;

Затем выполните вставку, а затем установите ее обратно на 1 после. Это переменная сеанса, хотя, таким образом, разъединение сбросит ее, и это не повлияет на другие соединения.

 2
Author: Vin-G, 2010-06-04 05:31:50