sqlite - 尝试插入空值时 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”列中。
解决方案
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
)
现在您将能够在Abilities
表的列中插入 NULL 值Creatures
。
但最好的办法是有一个像Abilities_Id
in这样的整数列Creatures
,引用PRIMARY KEY
表的Abilities
而不是Name
。
您可以在此处找到更多信息:SQLite 外键支持
推荐阅读
- ruby-on-rails - Rails 使用 Simple_form 嵌套表单。将输入的值传递给另一个
- algorithm - 无空格字符串中的关键字(使用 NLP?)
- android-studio - 如何仅在recyclerview中将动画添加到最后添加的项目
- javascript - 如何在不从 HTML 重新加载到烧瓶的情况下获取输入表单?
- ray - 在 OptiX 7 中计算命中点的表面法线
- python-3.x - pandas read_csv() 错误,即 FileNotFoundError: [Errno 2] 没有这样的文件或目录:'19.csv'
- google-chrome - 尽管需要许可,但 Chrome 扩展程序被拒绝
- amazon-web-services - 具有限制访问 s3 存储桶中的文件夹的策略的角色被忽略
- pine-script - PineScript / 转换为 V4
- python - 如何在列表中使用“\\”字符进行拆分