微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试使用 rowid 作为外键时,sqlite 中的外键不匹配错误

如何解决尝试使用 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 举报,一经查实,本站将立刻删除。