SQLite3无法删除行,没有这样的列错误

问题描述 投票:-1回答:1

我有一个简单的sqlite数据库设置,其中包含一个名为sightings的表,并且该表中的一列称为name。我可以运行普通的SELECT查询,而INSERT和UPDATE则很好,但是当我尝试运行DELETE时,它会以“ new”开头。进入我给它的列,然后说它不存在:

sqlite> DELETE FROM sightings WHERE name = "blah";
Error: no such column: new.name
sqlite> DELETE FROM sightings WHERE names = "blah";
Error: no such column: names

该列称为“名称”,当我选择该列时,它会添加“新”。在它前面,但是当我选择一个不存在的错误列时(如上面的“名称”),它只是说没有“ new”就通常不存在。任何帮助,将不胜感激。

sqlite sql-delete new-operator delete-row
1个回答
0
投票

似乎您有一个DELETE TRIGGER,并且TRIGGER错误地使用new.name来引用已删除行的名称列(对于旧的DELETE TRIGGER,则用来引用已删除行中的列)。] >

您应将触发器更改为使用旧名称

而不是新名称
  • new.column

    仅适用于INSERT或UPDATE触发器。
  • old.column

  • 仅适用于DELETE或UPDATE触发器。

    按照:-

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

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

SQL As Understood By SQLite - CREATE TRIGGER

也许考虑以下示例:-

CREATE TABLE IF NOT EXISTS sightings (name TEXT);
CREATE TABLE IF NOT EXISTS deleted_sightings (name TEXT); /* Table to be populated by the trigger */
INSERT INTO sightings VALUES ('blah'),('notblah'),('anothernotblah');
/* Normal deletion without triggers */
DELETE FROM sightings WHERE name = 'blah';
SELECT * FROM sightings; /* RESULT 1 (sightings table after deletion)*/

/* Add the row that was deleted again */
INSERT INTO sightings VALUES('blah');

/* Add a valid AFTER DELETE TRIGGER referring to the old column */
/* The Trigger will add a row to the deleted_sightings table using the value from the deleted row */
CREATE TRIGGER IF NOT EXISTS correct_trigger 
    AFTER DELETE ON sightings 
    BEGIN INSERT INTO deleted_sightings 
        VALUES(old.name); 
    END;
DELETE FROM sightings WHERE name = 'blah';
SELECT * FROM sightings; /* RESULT 2 (sightings table after deletion)*/
SELECT * FROM deleted_sightings; /* RESULT 3  deleted_sightings table */

/* Add a Trigger that will try to add a row to the deleted_sightings table */
/* BUT will result in the new.name column not being found as there is no */
/* new. for a DELETE trigger only old. */
CREATE TRIGGER IF NOT EXISTS incorrect_trigger AFTER DELETE ON sightings BEGIN INSERT INTO deleted_sightings VALUES(new.name); END;
/* Show the triggers */
SELECT * FROM sqlite_master WHERE type = 'trigger'; /* RESULT 4 - The triggers as per sqlite_master */
DELETE FROM sightings WHERE name = 'blah'; /* <<<<< DELETE will fail due to incorrect trigger */

结果为:-

enter image description here

enter image description here

enter image description here

enter image description here

以及由于错误的触发而导致的错误:-

/* RESULT 4 - The triggers as per sqlite_master */
DELETE FROM sightings WHERE name = 'blah'
> no such column: new.name
> Time: 0s
© www.soinside.com 2019 - 2024. All rights reserved.