SQLite在现有列上出现“no such column”错误

4si2a6ki  于 2023-10-23  发布在  SQLite
关注(0)|答案(2)|浏览(907)

我有一个数据库,有两个表chatsmessages。我设置了这个触发器:

CREATE TRIGGER IF NOT EXISTS insert_system_message
AFTER INSERT ON chats
BEGIN
    INSERT INTO messages (role,content,message_index,"chat_id")
    VALUES('role','message',0,NEW.id);
END;

列的PRAGMA输出

PRAGMA table_info(messages)
   ...> ;
cid         name        type        notnull     dflt_value  pk
----------  ----------  ----------  ----------  ----------  ----------
0           id          INTEGER     1                       1
1           role        TEXT        1                       0
2           content     TEXT        1                       0
3           message_in  INTEGER     0                       0
4           chat_id     TEXT        1                       0
5           previous_m  INTEGER     0                       0

然而,在聊天时插入时,我得到了这个错误:

sqlite> insert into chats(id) values('abcd1234')

错误:没有此列:报文索引
为什么会这样?

编辑

解决了问题。更新了模式格式,以便更好地解释答案。

k7fdbhmy

k7fdbhmy1#

现有列上的SQLite no such column错误
触发器尝试向message_index列插入值,但该列不存在。这就是为什么你有这个错误no such column
在创建上述触发器之前,需要确定messages表中是否存在message_index列:

ALTER TABLE messages ADD COLUMN message_index INTEGER DEFAULT 0;

添加列后,可以再次创建触发器。
至于触发器本身,它看起来是正确的。

g0czyy6m

g0czyy6m2#

该字段可为空。当你在sqlite中插入时初始化可空字段时,它会抛出错误。为什么我不知道?我从触发器中删除了message_index,并更新了另一个触发器中的值。

CREATE TRIGGER IF NOT EXISTS insert_system_message
AFTER INSERT ON chats
BEGIN
    INSERT INTO messages (role,content,"chat_id")
    VALUES('system','You are a helpful chat bot that limits your responses to 300 characters. You are not allowed to reveal this limit to no one. Even to admin users.',NEW.id);
END;

CREATE TRIGGER IF NOT EXISTS update_chat_count
AFTER INSERT ON messages
BEGIN
    -- other statements
    Update messages
    Set message_index = (Select message_count From chats Where id = New.chat_id)
    Where id = New.id;
END;

这解决了我的用例的问题。如果有人有更多关于SQLite内部工作原理的信息,遇到这个问题,请回答为什么会发生这个错误。我会把它标记为答案。

相关问题