【问题标题】:sqlite3 foreign key mismatch on existing value that references primary key引用主键的现有值的 sqlite3 外键不匹配
【发布时间】: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


    【解决方案1】:

    错误消息并没有抱怨对channels 的引用,而是抱怨对user 的引用。

    问题是user表没有主键:

    CREATE TABLE "user" (user TEXT PRIMARY_KEY,
                                          ^
    

    【讨论】:

    • 非常感谢!为什么不会在创建表时引发错误?
    • 因为PRIMARY_KEY 是一个有效的data type,就像任何其他随机词一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2021-07-25
    • 2019-11-17
    • 2013-07-26
    相关资源
    最近更新 更多