Я создаю таблицу людей и хочу записать таблицу производства с указанием суммы, которую каждый человек внес в это производство. Итак, у нас есть таблица дробления акций; каждое производство приносит определенное количество акций, на которое ссылается разделенный идентификатор, и каждый разделенный идентификатор охватывает несколько строк, указывающих, сколько акций получает каждый человек.
Почему код не работает при попытке добавить производство?
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;
.
🤔 А знаете ли вы, что...
SQL может работать с множеством языковых расширений, таких как PL/SQL, T-SQL и другими.
Согласно документации, цель внешнего ключа должна быть первичным ключом или иметь уникальный индекс именно для этих столбцов.
Судя по вашей текущей схеме, я не думаю, что есть простой способ это исправить.
Одно предложение: создайте таблицу splitids
только с одним столбцом первичного ключа и используйте ее как в sharesplits
, так и в productions
.