我有一个简单的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”就通常不存在。任何帮助,将不胜感激。
似乎您有一个DELETE TRIGGER,并且TRIGGER错误地使用new.name来引用已删除行的名称列(对于旧的DELETE TRIGGER,则用来引用已删除行中的列)。] >
您应将触发器更改为使用旧名称
而不是新名称。new.column
仅适用于INSERT或UPDATE触发器。old.column
按照:-
WHEN子句和触发器操作都可以访问以下元素使用参考引用插入,删除或更新的行格式为“ NEW.column-name”和“ OLD.column-name”,其中column-name为触发器与之关联的表中列的名称。新旧引用只能用于以下事件的触发器中:它们相关,如下所示:
- 插入新引用有效
- UPDATE NEW和OLD参考是有效
- 删除旧参考有效
也许考虑以下示例:-
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 */
结果为:-
以及由于错误的触发而导致的错误:-
/* RESULT 4 - The triggers as per sqlite_master */ DELETE FROM sightings WHERE name = 'blah' > no such column: new.name > Time: 0s