如何解决尝试使用 rowid 作为外键时,sqlite 中的外键不匹配错误
我有一个简单的两个表关系。成员,可以包含 0 个或多个字符。
方案如下:
CREATE TABLE IF NOT EXISTS 'main'.'member' (
'id' TEXT NOT NULL,'platform_id' INTEGER NOT NULL,PRIMARY KEY('id','platform_id')
);
CREATE TABLE IF NOT EXISTS 'main'.'character' (
'id' TEXT NOT NULL,'member_rowid' INTEGER NOT NULL,'member_rowid'),FOREIGN KEY ("member_rowid")
REFERENCES member ("rowid")
ON DELETE CASCADE
);
然后我像这样插入一个成员:
INSERT OR IGnorE into member ('id','platform_id') VALUES ("mid",1);
select rowid from member;
其中显示的 rowid 为 1。
但是,当我尝试像这样插入 Character 时:
INSERT OR IGnorE into character ('id','member_rowid') VALUES ("cid",1);
我收到以下错误:
Result: foreign key mismatch - "character" referencing "member"
At line 1:
INSERT OR IGnorE into character ('id',1);
我不清楚发生了什么,因为存在 rowid。我可以不使用 rowid 作为外键吗?
我看到一些关于外键必须引用“整个主键或唯一键/索引”的讨论。我认为 rowid 对此感到满意。
解决方法
k首先,您使用单引号作为标识符。我强烈、强烈地劝阻你不要这样做——即使 SQLite 允许这样做。仅对字符串和日期常量使用单引号。
其次,你的外键真的很奇怪。很遗憾 SQLite 接受了它。外键应该是主键。您可以指定 const int cnt = pCtx->getCnt();
为主键——很好。然后其他键应声明为 rowid
。
最后,当我尝试时,您拥有的代码有效。 Here 是一个 dbfiddle。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。