SQLite3 update触发器在所有行上激发,忽略何时和/或何处条件

SQLite3 update触发器在所有行上激发,忽略何时和/或何处条件,sqlite,Sqlite,我试图在Sqlite3中的表中添加一个更新触发器,该触发器更新所有行,尽管我努力将其限制为仅限于实际更改的行。简单组合示例表: CREATE TABLE IF NOT EXISTS prices ( id INTEGER PRIMARY KEY AUTOINCREMENT, base REAL DEFAULT 100.0, discount REAL DEFAULT 0.0, actual REAL DEFAULT 0.0 ); INSERT INTO price

我试图在Sqlite3中的表中添加一个更新触发器,该触发器更新所有行,尽管我努力将其限制为仅限于实际更改的行。简单组合示例表:

CREATE TABLE IF NOT EXISTS prices (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    base REAL DEFAULT 100.0,
    discount REAL DEFAULT 0.0,
    actual REAL DEFAULT 0.0
);
INSERT INTO prices(base,discount,actual) VALUES (100,0,100),(200,0,200),(300,0,300);
应使用以下触发器更新实际价格:

CREATE TRIGGER "upd" AFTER UPDATE OF discount ON prices FOR EACH ROW
WHEN (OLD.discount <> NEW.discount)
BEGIN
    UPDATE prices SET actual = base * (1-NEW.discount/100.0)
    WHERE OLD.discount <> NEW.discount;
END;
然后,触发器将触发所有行,而不仅仅是第二行,所有行中的“实际”字段将乘以0.5

如您所见,触发器戴着皮带和吊带:WHEN子句和WHERE子句都试图确保只有折扣值更改的行受到影响。通过指定其中一个/或时间、地点等尝试了所有4种组合,但均无效。以下是
更新后的表格内容:

1|100.0|0.0|50.0
2|200.0|50.0|100.0
3|300.0|0.0|150.0
请注意,这里有一个看似相关但OP使用了以下子句:
WHERE(OLD.id=NEW.id)
这当然是
TRUE
对于所有未更改的行,所以难怪它没有按预期工作。恐怕那里提供的解决办法不适用于我的情况。任何帮助都将不胜感激

编辑:在CL.-s解释之后,这里是正确的触发器:

CREATE TRIGGER "upd" AFTER UPDATE OF discount ON prices FOR EACH ROW
BEGIN
    UPDATE prices SET actual = base * (1-NEW.discount/100.0)
    WHERE id = NEW.id; -- this selects the row that fired the trigger!
END;
你犯的错误和Moodforday完全一样;我已经更新了答案,让它更清楚。谢谢,现在它清楚了。SQLite的原始文档在这方面显然不清楚。我来自Postgres,触发器调用存储的进程,存储的进程可以访问两条记录,新旧记录,保存触发触发器的行的新旧值。这意味着Postgres触发器函数不需要额外的
id=NEW.id
检查。非常感谢您的澄清。
CREATE TRIGGER "upd" AFTER UPDATE OF discount ON prices FOR EACH ROW
BEGIN
    UPDATE prices SET actual = base * (1-NEW.discount/100.0)
    WHERE id = NEW.id; -- this selects the row that fired the trigger!
END;