Android SQLite抛出错误“;外键不匹配“;

Android SQLite抛出错误“;外键不匹配“;,android,sql,sqlite,Android,Sql,Sqlite,在我的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,

在我的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表都包含记录。这里怎么了?在我看来,它应该是可以的。

您不能使外键成为同一个表的主键。您在
表中执行此错误

错误:

PRIMARY KEY (TourHeaderCode, TourdetailCode, DropPickupItemCode)
TourHeaderCode INT NOT NULL REFERENCES OBTTourHeader,
TourdetailCode INT NOT NULL REFERENCES OBTTourDetails,
PRIMARY KEY (TourHeaderCode, TourdetailCode, DropPickupItemCode)
解决方案:

PRIMARY KEY (TourHeaderCode, TourdetailCode, DropPickupItemCode)
TourHeaderCode INT NOT NULL REFERENCES OBTTourHeader,
TourdetailCode INT NOT NULL REFERENCES OBTTourDetails,
PRIMARY KEY (TourHeaderCode, TourdetailCode, DropPickupItemCode)
报告说:

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


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

我不能通过组合这三个(TourHeaderCode、TourdetailCode、DropPickupItemCode)来使用主键吗?您要找的是复合主键。而你用了错误的方法。但是,当我将数据输入到详细信息表时,它没有给出错误。我将TourHeaderCode和TourdetailCode定义为NOTNULL。TourdetailCode是复合主键的一部分。在这种情况下无效吗???当一列只是主键的一部分时,可以在该列中插入非唯一值(通过在其他PK列中具有唯一值)。