sqlite3外键与引用主键

时间:2017-04-08 21:59:56

标签: sqlite

我还没有使用过多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) 

而不是我把它作为两个单独的键。

我在架构中更改了此内容 - 但仍然会引发错误。

1 个答案:

答案 0 :(得分:1)

错误消息不会引用user的引用,而是user的引用。

问题是CREATE TABLE "user" (user TEXT PRIMARY_KEY, ^ 表没有主键:

cin>>a[m];