Само-ссылочные поля таблицы в MySQL - PullRequest
14 голосов
/ 04 июня 2010

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

Ответы [ 2 ]

18 голосов
/ 04 июня 2010

Один из вариантов - сделать ваше поле доступным для 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)
2 голосов
/ 04 июня 2010

Вы можете сделать:

SET FOREIGN_KEY_CHECKS = 0;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...