我还没有使用过多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"
我已经搜索了这个问题,并且很多人说当外键没有引用主键时会发生这种情况,但是,消息中的每个外键都引用了属于主键的内容。
我可以看到问题是否与频道或服务器有关,因为它们是部分主键,但用户是用户表的唯一主键。
非常感谢您提供的任何帮助。
更新
我发现this answer指定复合的主键必须具有匹配的复合外键,即在引用通道主键的消息中的外键应该是
FOREIGN KEY(channel_name, server_id) REFERENCES channels(channel_name, server_id)
而不是我把它作为两个单独的键。
我在架构中更改了此内容 - 但仍然会引发错误。
答案 0 :(得分:1)
错误消息不会引用user
的引用,而是user
的引用。
问题是CREATE TABLE "user" (user TEXT PRIMARY_KEY,
^
表没有主键:
cin>>a[m];