вставка sqlite в таблицу с нулевым внешним ключом

#sql #sqlite #foreign-keys

Вопрос:

У меня есть следующие таблицы: (обратите внимание, что SUPP может быть равен НУЛЮ)

 CREATE TABLE IF NOT EXISTS A 
(
  ID INTEGER PRIMARY KEY NOT NULL
);

CREATE TABLE IF NOT EXISTS B 
(
  ID INTEGER PRIMARY KEY NOT NULL
);

CREATE TABLE IF NOT EXISTS C 
(
  ID INTEGER PRIMARY KEY NOT NULL
);

CREATE TABLE IF NOT EXISTS D 
(
  SID INTEGER NOT NULL,
  DID INTEGER NOT NULL,
  SUPP INTEGER,
  PRIMARY KEY (SID, DID),
  FOREIGN KEY (SID) REFERENCES A (ID),
  FOREIGN KEY (DID) REFERENCES B (ID),
  FOREIGN KEY (SUPP) REFERENCES C (ID)
);
 

Предполагая, что таблица A содержит идентификатор=2, а таблица B содержит идентификатор=5.
Я хочу выполнить следующую вставку:

 INSERT OR REPLACE INTO D VALUES (2,5,NULL);
 

Однако я получаю следующую ошибку:

Несоответствие внешнего ключа — D, ссылающееся на C (ВСТАВИТЬ В «main».»D» …

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

Комментарии:

1. Это прекрасно работает для меня: db-fiddle.com/f/24vNe4tmPcn1uAnfppU6aG/0

2. Удалите последнюю , из FOREIGN KEY (SUPP) REFERENCES C (ID),

3. Но мне нужно, чтобы он соответствовал внешнему ключу ИЛИ был равен нулю.

4. Удалите запятую, а не ссылку.

5. Это опечатка. Его нет в реальной таблице. Я отредактирую.

Ответ №1:

Вам необходимо использовать допустимое значение ссылки, если вы вставляете его в дочернюю таблицу. Идентификатор 2 в таблице A и идентификатор 5 в таблице B должны присутствовать.

 CREATE TABLE IF NOT EXISTS A 
(
  ID INTEGER PRIMARY KEY NOT NULL
);

CREATE TABLE IF NOT EXISTS B   
(
  ID INTEGER PRIMARY KEY NOT NULL
);

CREATE TABLE IF NOT EXISTS C 
(
  ID INTEGER PRIMARY KEY NOT NULL
);

CREATE TABLE IF NOT EXISTS D 
(
    SID INTEGER NOT NULL,
    DID INTEGER NOT NULL,
    SUPP INTEGER,
    PRIMARY KEY (SID, DID),
    FOREIGN KEY (SID) REFERENCES A (ID),
    FOREIGN KEY (DID) REFERENCES B (ID),
    FOREIGN KEY (SUPP) REFERENCES C (ID)
);

INSERT INTO A VALUES (2);
INSERT INTO B VALUES (5);
INSERT INTO D VALUES (2, 5, NULL);
 

Комментарии:

1. Я уже упоминал, что предполагаю, что таблицы A и B уже содержат эти значения заранее. И они действительно содержат их.