我有一个sqlite数据库,结构如下:

CREATE TABLE IF NOT EXISTS Patient
( PatientId INTEGER PRIMARY KEY AUTOINCREMENT );

CREATE TABLE IF NOT EXISTS Event
(
PatientId INTEGER REFERENCES Patient( PatientId ),
DateTime TEXT,
EventTypeCode TEXT,
PRIMARY KEY( PatientId, DateTime, EventTypeCode )
);

CREATE TABLE IF NOT EXISTS Reading
(
PatientId INTEGER REFERENCES Patient( PatientId ),
DateTime TEXT REFERENCES Event (DateTime),
EventTypeCode TEXT REFERENCES Event (EventTypeCode),
Value REAL,
PRIMARY KEY( PatientId, DateTime, EventTypeCode )
);

我插入一个ID为1的患者
然后我跑:
INSERT INTO Event (PatientId, DateTime, EventTypeCode) VALUES (1, '2011-01-23 19:26:59', 'R')

哪个有效
然后我跑:
INSERT INTO Reading (PatientId, DateTime, EventTypeCode, Value) VALUES (1, '2011-01-23 19:26:59', 'R', 7.9)

它给了我一个外键不匹配。在所有情况下,患者ID都是“1”,并且日期时间和类型代码在第二个和第三个查询中匹配。我不明白什么是不匹配的,但我对定义外键有点陌生,不知道我做错了什么。

最佳答案

我不熟悉sqlite,但有一点google'ingturned up this。文件上说
如果数据库架构包含
需要的外键错误
查看多张桌子
定义,然后是那些

表已创建。相反,这样
错误阻止应用程序
正在准备修改的SQL语句
子级或父级的内容
使用外国语言的表格
钥匙。当内容为
更改为“DML错误”和错误
架构更改时报告
是“DDL错误”。换句话说,
配置错误的外键约束
那就需要看两个孩子
父级是DML错误。英国人
外键的语言错误消息
DML错误通常是“外键”
“不匹配”,但也可以是“不匹配”
表“如果父表没有
存在。外键DML错误可能是

报告条件:
父表不存在,或者
外键约束中名为的父键列不存在,

在外键约束中命名的父键列不是
父表的主键和
不受唯一约束
使用中指定的排序序列
创建表,或
子表引用的父表的主键没有
指定主键列和
中的主键列数
父级与
子键列。
我怀疑你可能会碰到那个名单上的第三个。
另外,尽管其他DBS可能支持使用非唯一索引作为外键引用,(see answers here),但我认为这是一个糟糕的设计选择。我会重组以便
Reading.PatientIdreferencesEvent.PatientIdso that the complete composite key fromEventis referenced byReadingor,
EventId表中添加一个Eventauto increment,primary key,并将其用作Reading表中的外键(这样,您只有EventId下的ValueReading才可以将PatientId, DateTime, EventTypeCodeEvent中取出)。
我建议2这样你就可以避免PatientId, DateTimeEventTypeCode的冗余。

关于sql - 是什么导致外键错配错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5208245/

10-13 07:45
查看更多