首页 > 解决方案 > 尝试插入空值时 SQLite 外键不匹配

问题描述

我有以下表格:

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);

错误。但我认为如果我尝试在外键中插入“null”就可以了吗?在这种情况下,我希望能够为某些“能力”值插入空值,因为并非所有记录都必须具有“能力”值。

我该如何做到这一点,以便每当将某些内容插入“Creatures”时,SQL 都会检查“Ability”是否不为 NULL,那么该记录必须存在于“Abilities”表的“Name”列中。

标签: sqliteforeign-keys

解决方案


Name问题是表中引用的列Abilities不是PRIMARY KEY表的(为什么你想要名称Creatures而不是id通常的做法?),它也不是UNIQUE
如果引用的列不是,则不能在表UNIQUE的列中插入任何值,而不仅仅是. 改成这样:AbilitiesCreaturesNULL

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

现在您将能够在Abilities表的列中插入 NULL 值Creatures

但最好的办法是有一个像Abilities_Idin这样的整数列Creatures,引用PRIMARY KEY表的Abilities而不是Name

您可以在此处找到更多信息:SQLite 外键支持


推荐阅读