Самосправочный MySQL Table Fields In

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

14
задан Michael Petrotta 4 June 2010 в 05:00
поделиться

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)
19
ответ дан 1 December 2019 в 12:51
поделиться

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

SET FOREIGN_KEY_CHECKS = 0;

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

2
ответ дан 1 December 2019 в 12:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: