Что вызывает это несоответствие внешнего ключа 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

Через список в вопросе, который я привел:

  • существует родительская таблица (пользователь).
  • существуют родительские столбцы (имя, владелец)
  • родительские столбцы – это, по сути, первичный ключ (я думал, что это было изначально)
  • дочерняя таблица ссылается на все столбцы первичного ключа в родительской таблице

И что в мире может вызвать эту ошибку?

Лучший ответ:

В документации говорится:

Обычно родительский ключ ограничения внешнего ключа является первичным ключом родительской таблицы. Если они не являются первичным ключом, то столбцы родительского ключа должны быть совместно подчинены ограничению UNIQUE или иметь индекс UNIQUE.

В таблице pipelines ни столбцы name, ни столбцы owner сами по себе не уникальны.

Я думаю, вы действительно хотите иметь двухстоечный внешний ключ в таблице tasks:

FOREIGN KEY(pipeline, owner) REFERENCES pipelines(name, owner)

Оцените статью
TechArks.Ru
Добавить комментарий