#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 уже содержат эти значения заранее. И они действительно содержат их.