Исправить ограничение внешнего ключа в этой базе данных SQLite3?

Я создаю таблицу людей и хочу записать таблицу производства с указанием суммы, которую каждый человек внес в это производство. Итак, у нас есть таблица дробления акций; каждое производство приносит определенное количество акций, на которое ссылается разделенный идентификатор, и каждый разделенный идентификатор охватывает несколько строк, указывающих, сколько акций получает каждый человек.

Почему код не работает при попытке добавить производство?

PRAGMA foreign_keys = ON;

CREATE TABLE people ( personid INTEGER PRIMARY KEY, name TEXT NOT NULL);

INSERT INTO "main"."people" ("name") VALUES ('Alice');
INSERT INTO "main"."people" ("name") VALUES ('Bob');
INSERT INTO "main"."people" ("name") VALUES ('Carol');

CREATE TABLE sharesplits ( splitid INTEGER NOT NULL, person INTEGER NOT NULL, numshares INTEGER NOT NULL, FOREIGN KEY(person) REFERENCES people(personid));

INSERT INTO "main"."sharesplits" ("splitid", "person", "numshares") VALUES (1, 1, 2); -- for splitid 1 Alice earns 2 shares
INSERT INTO "main"."sharesplits" ("splitid", "person", "numshares") VALUES (2, 1, 1); --\
INSERT INTO "main"."sharesplits" ("splitid", "person", "numshares") VALUES (2, 2, 1); --- for splitid 2 Alice, Bob and Carol all earn 1 share each
INSERT INTO "main"."sharesplits" ("splitid", "person", "numshares") VALUES (2, 3, 1); --/

CREATE TABLE productions (id INTEGER PRIMARY KEY, sharesearned INTEGER NOT NULL, FOREIGN KEY(sharesearned) REFERENCES sharesplits(splitid));

INSERT INTO "main"."productions" ("id", "sharesearned") VALUES (1, 1);
-- ^ FAILS With Result: foreign key mismatch - "productions" referencing "sharesplits"

SQLite по умолчанию игнорирует ограничения внешних ключей; отсюда PRAGMA foreign_keys = ON;.

Я запустил ваш код в sqlite 3.46.0, ошибок не было.

Dogbert 05.08.2024 10:22

Я просто запускаю ваш код в Sqlite 3.39. Нет ошибки

Mitch Wheat 05.08.2024 10:25

Предыдущие комментарии были до того, как я отредактировал их, добавив недостающее утверждение PRAGMA. Я только что снова протестировал себя в версии 3.46.0, и все вышло с той же ошибкой.

Tyr 05.08.2024 11:18

См. Как работают ответы на комментарии? научиться использовать @x для уведомления 1 неединственного комментатора, не публикующего сообщения x о каждом комментарии об этом комментарии. Авторы постов, отдельные комментаторы и подписчики публикаций всегда получают уведомления. Без @ другие комментаторы не получат уведомлений. PS В этом посте не было вопроса. PS Пожалуйста, избегайте социальных и мета-комментариев в сообщениях. Пожалуйста, не вставляйте «EDIT»/«UPDATE», просто сделайте свой пост лучшим на момент редактирования.

philipxy 05.08.2024 11:33

@Тир, я думаю, ты сталкиваешься с этим: sqlite.org/foreignkeys.html#fk_indexes. Целью ограничения внешнего ключа должен быть первичный ключ или иметь уникальный индекс.

Dogbert 05.08.2024 14:06

@ Догберт, я думаю, ты прав. Если вы хотите опубликовать это в качестве ответа, я приму это. Это прискорбно, потому что я не могу просто поместить уникальный ключ в таблицу разделения ресурсов, поэтому мне придется либо удалить отношение внешнего ключа, либо добавить еще одну промежуточную таблицу для использования разделения ресурсов. Думаю, я просто приму тот факт, что база данных явно не знает, что они связаны, это менее запутанно и достаточно хорошо соответствует моим потребностям.

Tyr 05.08.2024 14:46
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
7
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно документации, цель внешнего ключа должна быть первичным ключом или иметь уникальный индекс именно для этих столбцов.

Судя по вашей текущей схеме, я не думаю, что есть простой способ это исправить.

Одно предложение: создайте таблицу splitids только с одним столбцом первичного ключа и используйте ее как в sharesplits, так и в productions.

Другие вопросы по теме