是什么导致sqlite数据库中的外键不匹配错误
What causes a foreign key mismatch error in sqlite database
这是我的 student_table 创建查询
CREATE TABLE "student_table" (
"student_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" TEXT NOT NULL,
"gender" TEXT NOT NULL,
"year_admited" INTEGER
);
这是给我的 year_table
CREATE TABLE "year_table" (
"year" INTEGER NOT NULL,
"student_id" INTEGER NOT NULL,
"class" INTEGER NOT NULL,
PRIMARY KEY("year"),
FOREIGN KEY("student_id") REFERENCES "student_table"("student_id")
);
这是 terms_table
CREATE TABLE "terms_table" (
"year" INTEGER NOT NULL,
"student_id" INTEGER NOT NULL,
"term" INTEGER NOT NULL,
"fees" INTEGER,
PRIMARY KEY("term","year"),
FOREIGN KEY("year") REFERENCES "year_table"("year"),
FOREIGN KEY("student_id") REFERENCES "year_table"("student_id")
);
我成功地在 student_table 和 year_table
中插入了一行
我尝试为术语添加值 table
INSERT INTO "main"."terms_table"
("year", "student_id", "term", "fees")
VALUES (2020, 1, 1, 900000);
但它给出了这个错误
Error adding record. Message from database engine:
foreign key mismatch - "terms_table" referencing "year_table" (INSERT INTO
"main"."terms_table"
("year", "student_id", "term", "fees")
VALUES (2020, 1, 1, 900000);)
我正在为 SQLite 使用 dB 浏览器
我做错了什么?
来自 Required and Suggested Database Indexes:
Usually, the parent key of a foreign key constraint is the primary key
of the parent table. If they are not the primary key, then the parent
key columns must be collectively subject to a UNIQUE constraint or
have a UNIQUE index.
您在代码中做错的是 terms_table
的 CREATE
语句:
FOREIGN KEY("student_id") REFERENCES "year_table"("student_id")
定义列 student_id
以引用 year_table
中的列 student_id
,其中没有 UNIQUE
约束或索引。
year_table
中的 student_id
列仅引用 student_table
的 student_id
列。
你可以做的是定义terms_table
的student_id
列来引用student_table
中的student_id
列,这是有道理的:
FOREIGN KEY("student_id") REFERENCES "student_table"("student_id")
参见demo。
这是我的 student_table 创建查询
CREATE TABLE "student_table" (
"student_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" TEXT NOT NULL,
"gender" TEXT NOT NULL,
"year_admited" INTEGER
);
这是给我的 year_table
CREATE TABLE "year_table" (
"year" INTEGER NOT NULL,
"student_id" INTEGER NOT NULL,
"class" INTEGER NOT NULL,
PRIMARY KEY("year"),
FOREIGN KEY("student_id") REFERENCES "student_table"("student_id")
);
这是 terms_table
CREATE TABLE "terms_table" (
"year" INTEGER NOT NULL,
"student_id" INTEGER NOT NULL,
"term" INTEGER NOT NULL,
"fees" INTEGER,
PRIMARY KEY("term","year"),
FOREIGN KEY("year") REFERENCES "year_table"("year"),
FOREIGN KEY("student_id") REFERENCES "year_table"("student_id")
);
我成功地在 student_table 和 year_table
中插入了一行我尝试为术语添加值 table
INSERT INTO "main"."terms_table"
("year", "student_id", "term", "fees")
VALUES (2020, 1, 1, 900000);
但它给出了这个错误
Error adding record. Message from database engine:
foreign key mismatch - "terms_table" referencing "year_table" (INSERT INTO
"main"."terms_table"
("year", "student_id", "term", "fees")
VALUES (2020, 1, 1, 900000);)
我正在为 SQLite 使用 dB 浏览器
我做错了什么?
来自 Required and Suggested Database Indexes:
Usually, the parent key of a foreign key constraint is the primary key of the parent table. If they are not the primary key, then the parent key columns must be collectively subject to a UNIQUE constraint or have a UNIQUE index.
您在代码中做错的是 terms_table
的 CREATE
语句:
FOREIGN KEY("student_id") REFERENCES "year_table"("student_id")
定义列 student_id
以引用 year_table
中的列 student_id
,其中没有 UNIQUE
约束或索引。
year_table
中的 student_id
列仅引用 student_table
的 student_id
列。
你可以做的是定义terms_table
的student_id
列来引用student_table
中的student_id
列,这是有道理的:
FOREIGN KEY("student_id") REFERENCES "student_table"("student_id")
参见demo。