Несоответствие внешнего ключа SQLite при попытке вставить нулевое значение - PullRequest
0 голосов
/ 20 ноября 2019

У меня есть следующие таблицы:

CREATE TABLE "Abilities" (
"ID"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
"Name"  TEXT NOT NULL,
"Description"   TEXT NOT NULL
)

и

CREATE TABLE "Creatures" (
"ID"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
"Faction"   TEXT,
"Name"  TEXT NOT NULL UNIQUE,
"Tier"  INTEGER NOT NULL DEFAULT 1,
"Upgrade"   INTEGER NOT NULL DEFAULT 0,
"GoldCost"  INTEGER NOT NULL DEFAULT 0,
"PopulationWeekly"  INTEGER NOT NULL DEFAULT 0,
"Attack"    INTEGER NOT NULL DEFAULT 0,
"Defense"   INTEGER NOT NULL DEFAULT 0,
"DamageMin" INTEGER NOT NULL DEFAULT 0,
"DamageMax" INTEGER NOT NULL DEFAULT 0,
"Initiative"    INTEGER NOT NULL DEFAULT 0,
"Speed" INTEGER NOT NULL DEFAULT 0,
"Health"    INTEGER NOT NULL DEFAULT 0,
"Mana"  INTEGER NOT NULL DEFAULT 0,
"Shots" INTEGER NOT NULL DEFAULT 0,
"Experience"    INTEGER NOT NULL DEFAULT 0,
"PowerRating"   INTEGER NOT NULL DEFAULT 0,
"Abilities" TEXT,
FOREIGN KEY("Abilities") REFERENCES "Abilities"("Name")
)

При попытке сделать следующую вставку:

INSERT INTO "main"."Creatures"
("Faction", "Name", "Abilities")
VALUES ('Academy', 'Gremlin', null);

Я получаю:

Result: foreign key mismatch - "Creatures" referencing "Abilities"
At line 1:
INSERT INTO "main"."Creatures"
("Faction", "Name", "Abilities")
VALUES ('Academy', 'Gremlin', null);

ошибка. Но я думал, что все будет в порядке, если я попытаюсь вставить «ноль» во внешний ключ? В этом случае я хочу иметь возможность вставлять пустые значения для некоторых значений «Ability», поскольку не все записи должны иметь значение «Ability».

Как мне сделать так, чтобы при вставке чего-либо в «Существа "SQL проверит, если" Способность "НЕ НЕДЕЙСТВИТЕЛЬНА, то запись должна существовать в столбце" Имя "таблицы" Способности ".

1 Ответ

1 голос
/ 20 ноября 2019

Проблема в том, что указанный столбец Name в таблице Abilities не является PRIMARY KEY таблицы (почему вы хотите имя в Creatures, а не id, что является обычной практикой?) и это тоже не UNIQUE. Если указанный столбец не является UNIQUE, вы не можете вставить любое значение в столбец Abilities таблицы Creatures, а не только NULL. Измените это на:

CREATE TABLE "Abilities" (
    "ID"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    "Name"  TEXT NOT NULL UNIQUE,
    "Description"   TEXT NOT NULL
)

Теперь вы сможете вставить значения NULL в столбец Abilities таблицы Creatures. Но лучше всего иметь целочисленный столбец, такой как Abilities_Id в Creatures, ссылающийся на PRIMARY KEY таблицы Abilities вместо Name. Вы можете найти больше здесь: Поддержка внешнего ключа SQLite

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...