我有一个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.PatientId
referencesEvent.PatientId
so that the complete composite key fromEvent
is referenced byReading
or,
在EventId
表中添加一个Event
auto increment,primary key,并将其用作Reading
表中的外键(这样,您只有EventId
下的Value
和Reading
才可以将PatientId, DateTime, EventTypeCode
从Event
中取出)。
我建议2这样你就可以避免PatientId, DateTime
和EventTypeCode
的冗余。
关于sql - 是什么导致外键错配错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5208245/