【发布时间】:2017-04-08 21:59:55
【问题描述】:
我没有使用太多 sqlite3,但我使用了许多其他 SQL dbms',这个问题让我有点困惑。
这是我的数据库的架构:
CREATE TABLE "user" (user TEXT PRIMARY_KEY,
password BINARY(255) NOT NULL,
server_id TEXT NOT NULL UNIQUE);
CREATE TABLE "channels"
(server_id TEXT NOT NULL,
channel_name TEXT NOT NULL,
FOREIGN KEY(server_id) REFERENCES user(server_id) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT channels_pk PRIMARY KEY (channel_name, server_id));
CREATE TABLE "messages"
(server_id TEXT NOT NULL,
channel_name TEXT NOT NULL,
user TEXT NOT NULL,
timestamp INTEGER,
content TEXT NOT NULL,
FOREIGN KEY(server_id) REFERENCES channels(server_id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY(channel_name) REFERENCES channels(channel_name) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY(user) REFERENCES user(user) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT messages_pk PRIMARY KEY (server_id, channel_name, user, timestamp));
我遇到以下问题:
当前存在一个用户,名为“hello”:
hello | $argon2d$v=19$m=4096,t=3,p=1$oyvxHO2dXfTKVFJ/6/81Nw$MJk82FuxIQLJLfENYJ8Yq0dURN8vga4VXqyJM2vpS3E | hq8PYzf
存在一个频道:
hq8PYzf | DefaultChannel
这里是爆炸发生的地方:
INSERT INTO messages (server_id, channel_name, user, timestamp, content)
VALUES ('hq8PYzf','DefaultChannel',
'hello', 1491688597191,
'here is a message!');
我很高兴:
Error: foreign key mismatch - "messages" referencing "user"
我已经搜索了这个问题,很多人说当外键没有引用主键时会发生这种情况,但是,消息中的每个外键都引用了主键的一部分。
我可以看到问题出在通道还是服务器上,因为它们是部分主键,但 user 是 user 表的唯一主键。
您能提供的任何帮助将不胜感激。
更新:
我发现this answer 指定复合主键必须具有匹配的复合外键,即我在引用频道主键的消息中的外键应该是
FOREIGN KEY(channel_name, server_id) REFERENCES channels(channel_name, server_id)
而不是我如何将它作为两个单独的键。
我已经在架构中更改了它 - 但它仍然抛出错误。
【问题讨论】:
标签: sqlite