Что вызывает это несоответствие внешнего ключа sqlite?
Я уже проверил этот вопрос, и думал, что у меня есть ответ - но тогда это не выглядело правильным для меня.
у меня есть следующий сокращенный пример:
CREATE TABLE pipelines (
name VARCHAR NOT NULL,
owner VARCHAR NOT NULL,
description VARCHAR,
PRIMARY KEY (name, owner),
FOREIGN KEY(owner) REFERENCES user (id)
);
CREATE TABLE tasks (
id INTEGER NOT NULL,
title VARCHAR,
pipeline VARCHAR,
owner VARCHAR,
PRIMARY KEY (id),
FOREIGN KEY(pipeline) REFERENCES pipelines (name),
FOREIGN KEY(owner) REFERENCES pipelines (owner)
);
CREATE TABLE user (
id VARCHAR NOT NULL,
name VARCHAR,
password VARCHAR,
PRIMARY KEY (id)
);
pragma foreign_keys=on;
insert into user values ('wayne', '', '');
insert into pipelines values ('pipey', 'wayne', '');
insert into tasks values (1, 'hello', 'pipey', 'wayne');
при выполнении этого кода вываливается:
$ sqlite3 foo.sq3 '.read mismatch.sql'
Error: near line 27: foreign key mismatch
через список в вопросе, который я привел:
- родительская таблица (пользователь) существует.
- родительские столбцы (имя, владелец) существуют
- родительские столбцы являются, по сути, первичный ключ (я думал, что это могло быть изначально)
- дочерняя таблица ссылается на все столбцы первичного ключа в родительской таблице
Так что в мире может быть причиной этой ошибки?
1 ответов
на документация говорит:
обычно Родительский ключ ограничения внешнего ключа является первичным ключом родительской таблицы. Если они не являются первичным ключом, то столбцы родительского ключа должны коллективно подчиняться ограничению UNIQUE или иметь уникальный индекс.
на pipelines
таблица, ни name
, ни owner
столбцы сами по себе уникальны.
Я думаю, вы действительно хотите иметь два столбца внешний ключ в tasks
стол:
FOREIGN KEY(pipeline, owner) REFERENCES pipelines(name, owner)