У меня есть таблица, которая имеет "внешний ключ", ссылающийся на себя. Это было бы очень полезно, но я не уверен, как добавить первую запись в такую таблицу. Независимо от того, что я добавляю, я не могу предоставить действительный "чужой" ключ для самой таблицы, у которого нет записей. Возможно, я не буду это делать правильно, но я хочу, чтобы эта таблица представляла то, что всегда является его членом. Есть ли способ "загружать" такую таблицу или другой способ сделать самостоятельную ссылку?
Поля самореферентной таблицы в MySQL
Ответ 1
Один из вариантов - сделать ваше поле 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)
Ответ 2
Вы можете сделать:
SET FOREIGN_KEY_CHECKS = 0;
Затем выполните вставку, а затем установите ее на 1 после. Это переменная сеанса, поэтому отключить будет reset, и это не повлияет на другие подключения.