无法删除SQLite数据库中的行

时间:2019-11-28 09:00:08

标签: sqlite

在删除SQLite数据库中的行时出现错误。
可能是我在约束上犯了一个错误。需要帮助。

我的第一个表包含可以在其他表中使用的数字。

CREATE TABLE message_numbers (
    number INTEGER PRIMARY KEY ASC
);

INSERT INTO message_numbers (number) VALUES (1), (10), (100);

第二张表有一个限制,只能使用第一张表中的数字。

CREATE TABLE messages_ger (
    number  INTEGER NOT NULL
                    UNIQUE,
    message TEXT,
    FOREIGN KEY (
        number
    )
    REFERENCES message_numbers (number) ON DELETE NO ACTION
                                        ON UPDATE NO ACTION
);

INSERT INTO messages_ger (number, message) VALUES (100, 'Test');

如果我尝试从表中删除一行,则会出现错误:

DELETE FROM messages_ger WHERE number=100;

[09:46:09]在数据库'myDB'上执行SQL查询时出错:没有这样的列:new.number

我做错了什么?

1 个答案:

答案 0 :(得分:0)

  

我在做什么错了?

这表明您已经定义了 TRIGGER 猜测是 ON DELETE 触发器,并且在 BEGIN中有一条语句 ... END 子句或 WHEN 子句试图在 new 时引用 new.number 只能在 ON INSERT ON UPDATE 触发器中使用。按照:-

  

WHEN子句和触发操作都可以访问以下元素:   使用参考引用插入,删除或更新的行   格式为“ NEW.column-name”和“ OLD.column-name”,其中column-name为   触发器与之关联的表中列的名称。   新旧引用只能用于以下事件的触发器中:   它们相关,如下所示:

     
      
  • 插入新引用有效
  •   
  • 更新NEW和OLD参考是   有效
  •   
  • 删除旧引用有效
  •   
     

如果提供了WHEN子句,   指定的SQL语句仅在WHEN子句为   真正。如果未提供WHEN子句,则执行SQL语句   每次触发器触发时。SQL As Understood By SQLite - CREATE TRIGGER

您可以使用以下方法确定存在哪些触发器:-

SELECT * FROM sqlite_master WHERE type = 'trigger';

您需要修改触发器(使用 old.number 而不是 new.number 删除并创建TRIGGER),或删除TRIGGER。

相关问题