sql—为什么在尝试将父表中的唯一值插入子表时外键不匹配?

shyt4zoc  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(314)

我试图插入 Subject 字段输入 Main_Standards 进入 Name 领域 Subjects ,它是引用 Subject 现场。
这是我的 Main_Standards 表格:

CREATE TABLE "Main_Standards" (
    "ID"    INTEGER NOT NULL UNIQUE,
    "Subfield"  TEXT NOT NULL,
    "Domain"    TEXT NOT NULL,
    "Code"  INTEGER NOT NULL UNIQUE,
    "Standard_Type" TEXT NOT NULL,
    "Assessment_Type"   TEXT NOT NULL,
    "Subject"   TEXT,
    "Subject_Reference" TEXT,
    "Title" TEXT NOT NULL,
    "Level" INTEGER NOT NULL,
    "Credits"   INTEGER NOT NULL,
    "Grading_Scheme"    TEXT NOT NULL,
    "Status"    TEXT NOT NULL,
    "Expiry_Date"   TEXT,
    "Publication_Date"  TEXT NOT NULL,
    "CurrentVersion"    INTEGER NOT NULL,
    "Hyperlink" TEXT,
    PRIMARY KEY("ID" AUTOINCREMENT)
)

这是我的 Subjects table。

CREATE TABLE "Subjects" (
    "ID"    INTEGER NOT NULL UNIQUE,
    "Name"  TEXT NOT NULL UNIQUE,
    "Subfield"  TEXT NOT NULL,
    "Selected"  TEXT NOT NULL DEFAULT 'False',
    FOREIGN KEY("Name") REFERENCES "Main_Standards"("Subject"),
    PRIMARY KEY("ID" AUTOINCREMENT)
)

这是导致抛出错误的查询:

INSERT OR IGNORE INTO Subjects(Name, Subfield)
SELECT DISTINCT
Subject, 
Subfield
FROM Main_Standards
WHERE Standard_Type = 'A';

错误本身:

Execution finished with errors.
Result: foreign key mismatch - "Subjects" referencing "Main_Standards"
At line 1:
INSERT OR IGNORE INTO Subjects(Name)
SELECT DISTINCT
Subject
FROM Main_Standards
WHERE Standard_Type = 'A';
jjhzyzn0

jjhzyzn01#

根据文件:
通常,外键约束的父键是父表的主键。如果它们不是主键,则父键列必须共同受唯一约束或具有唯一索引。 Main_Standards.Subject 不是表的pk,也没有任何东西表明表上有唯一的索引。因此,当您尝试将其用作父密钥时,会出现一个错误。
不相关,但是 PRIMARY KEY 从定义上讲,这些都是独一无二的。您不需要同时指定 UNIQUE 和他们在一起。这样做很悲观,因为它创建了一个冗余索引,每次修改表时都必须更新该索引。

相关问题