是什么导致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_tableCREATE 语句:

FOREIGN KEY("student_id") REFERENCES "year_table"("student_id")

定义列 student_id 以引用 year_table 中的列 student_id,其中没有 UNIQUE 约束或索引。
year_table 中的 student_id 列仅引用 student_tablestudent_id 列。

你可以做的是定义terms_tablestudent_id列来引用student_table中的student_id列,这是有道理的:

FOREIGN KEY("student_id") REFERENCES "student_table"("student_id")

参见demo