【问题标题】:SQLite throws error "Foreign key mismatch"SQLite 抛出错误“外键不匹配”
【发布时间】:2014-01-21 08:31:12
【问题描述】:

在我的 SQLite 数据库中,我创建了如下三个表。

CREATE TABLE OBTTourHeader
(
TourHeaderCode INT PRIMARY KEY     NOT NULL,
VehicleCode VARCHAR(10)    NOT NULL,
LastMilage DOUBLE,
TourReference VARCHAR(20)  NOT NULL,
TourFromDate TEXT  NOT NULL,
TourToDate TEXT  NOT NULL,
TourAssignTo VARCHAR(30)  ,
DriverNmae VARCHAR(30)  ,
AssistantName VARCHAR(30)  ,
Porter1Name VARCHAR(30)  ,
Porter2Name VARCHAR(30)  ,
Porter3Name VARCHAR(30)  ,
RouteCode INT,
Active CHAR(1)  NOT NULL,
CreatedOn TEXT ,
CreatedBy CHAR(10),
UpdateOn TEXT,
Updateby CHAR(10)
);



CREATE TABLE OBTTourDetails
(
TourHeaderCode INT    NOT NULL,
TourdetailCode INT    NOT NULL,
VisitSequence INT NOT NULL,
LocationNmae VARCHAR(30)  NOT NULL,
CityName VARCHAR(30)  NOT NULL,
Type CHAR(1)   NOT NULL,
Status CHAR(1)   NOT NULL,
TypeColor CHAR(20)  ,
statusColor CHAR(20)  ,
Active CHAR(1)  NOT NULL,
CreatedOn TEXT ,
CreatedBy CHAR(10),
UpdateOn TEXT,
Updateby CHAR(10),
FOREIGN KEY (TourHeaderCode) REFERENCES OBTTourHeader(TourHeaderCode),
PRIMARY KEY (TourHeaderCode , TourdetailCode)

);


CREATE TABLE OBTTourDropPickItems
(
TourHeaderCode INT NOT NULL,
TourdetailCode INT NOT NULL,
DropPickupItemCode INT NOT NULL,
Status CHAR(1) NOT NULL,
CreatedOn TEXT ,
CreatedBy CHAR(10),
UpdateOn TEXT,
Updateby CHAR(10),
FOREIGN KEY (TourHeaderCode) REFERENCES OBTTourHeader(TourHeaderCode),
FOREIGN KEY (TourdetailCode) REFERENCES OBTTourDetails(TourdetailCode),
PRIMARY KEY (TourHeaderCode, TourdetailCode, DropPickupItemCode)


);

我尝试使用以下语句输入记录:

INSERT INTO OBTTourDropPickItems (TourHeaderCode, TourdetailCode, DropPickupItemCode, Status, CreatedOn, CreatedBy)
VALUES ('1','1','1','1','21/01/2013','samantha');

它给了我一个错误“外键不匹配”:

我无法找出错误。 OBTTourDetails 表和 OBTTourHeader 表都包含记录。这里出了什么问题?对我来说应该没问题。

【问题讨论】:

    标签: android sql sqlite


    【解决方案1】:

    您不能将外键作为同一张表的主键。您在OBTTourDropPickItems 表中犯了这个错误。

    错误:

    PRIMARY KEY (TourHeaderCode, TourdetailCode, DropPickupItemCode)
    

    解决方案:

    TourHeaderCode INT NOT NULL REFERENCES OBTTourHeader,
    TourdetailCode INT NOT NULL REFERENCES OBTTourDetails,
    PRIMARY KEY (TourHeaderCode, TourdetailCode, DropPickupItemCode)
    

    【讨论】:

    • 我不能通过结合这三个(TourHeaderCode、TourdetailCode、DropPickupItemCode)来使用主键
    • 您正在寻找的是复合主键。而你做错了。
    • 好的。但是当我在 OBTTourDetails 表中输入数据时,它没有给出错误。它也有同一种主键。
    • 我将 TourHeaderCode 和 TourdetailCode 定义为非空。
    【解决方案2】:

    documentation 说:

    通常,外键约束的父键是父表的主键。如果它们不是主键,则父键列必须共同受制于 UNIQUE 约束或具有 UNIQUE 索引。

    您的OBTTourDetails(TourdetailCode) 列没有这样的索引。

    【讨论】:

    • TourdetailCode 是复合主键的一部分。在这种情况下无效吗????
    • 当一列只是主键的一部分时,可以在该列中插入非唯一值(通过在其他PK列中具有唯一值)。
    猜你喜欢
    • 2018-10-20
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多