SQLite 触发器有条件地递增值
SQLite Trigger to increment values conditionally
我有一个列,我想根据新的 inserted/updated 记录增加,但到目前为止我所得到的是行不通的。
所以我的 table ProcedureCommands
有一列 Sequence
,它是一个整数。例如,每当使用 Sequence
值 5 创建新记录时,我希望所有具有相同 ProcedureId
和 Sequence
值 >= 5 的记录都增加 1.
Table 脚本
CREATE TABLE ProcedureCommands (
ProcedureCommandId INTEGER PRIMARY KEY AUTOINCREMENT
NOT NULL,
ProcedureId INTEGER NOT NULL,
Sequence INTEGER NOT NULL);
INSERT INTO ProcedureCommands(ProcedureId, Sequence) VALUES(1, 3);
INSERT INTO ProcedureCommands(ProcedureId, Sequence) VALUES(1, 4);
INSERT INTO ProcedureCommands(ProcedureId, Sequence) VALUES(1, 5);
INSERT INTO ProcedureCommands(ProcedureId, Sequence) VALUES(1, 6);
INSERT INTO ProcedureCommands(ProcedureId, Sequence) VALUES(2, 4);
INSERT INTO ProcedureCommands(ProcedureId, Sequence) VALUES(2, 5);
触发脚本
CREATE TRIGGER Update_Sequence UPDATE OF Sequence ON ProcedureCommands FOR EACH ROW
BEGIN
UPDATE ProcedureCommands
SET Sequence = CASE WHEN Sequence >= new.Sequence THEN Sequence = Sequence + 1 ELSE Sequence END
WHERE ProcedureId = new.ProcedureId;
END;
不幸的是,所写的触发器不起作用。如何在 inserts/updates 之后有条件地递增字段?
处理新记录的触发器是 INSERT 触发器。
Sequence = Sequence + 1
比较两个值,returns比较的结果。在这种情况下,这两个值永远不会相等,因此结果始终为零。
并且您不想更新插入的行本身,因此您必须使用 >
而不是 >=
。
如果不想更新某些行,将过滤器放在 WHERE 子句中会更容易:
CREATE TRIGGER Update_Sequence
AFTER INSERT ON ProcedureCommands
FOR EACH ROW
BEGIN
UPDATE ProcedureCommands
SET Sequence = Sequence + 1
WHERE ProcedureId = new.ProcedureId
AND Sequence > new.Sequence;
END;
我有一个列,我想根据新的 inserted/updated 记录增加,但到目前为止我所得到的是行不通的。
所以我的 table ProcedureCommands
有一列 Sequence
,它是一个整数。例如,每当使用 Sequence
值 5 创建新记录时,我希望所有具有相同 ProcedureId
和 Sequence
值 >= 5 的记录都增加 1.
Table 脚本
CREATE TABLE ProcedureCommands (
ProcedureCommandId INTEGER PRIMARY KEY AUTOINCREMENT
NOT NULL,
ProcedureId INTEGER NOT NULL,
Sequence INTEGER NOT NULL);
INSERT INTO ProcedureCommands(ProcedureId, Sequence) VALUES(1, 3);
INSERT INTO ProcedureCommands(ProcedureId, Sequence) VALUES(1, 4);
INSERT INTO ProcedureCommands(ProcedureId, Sequence) VALUES(1, 5);
INSERT INTO ProcedureCommands(ProcedureId, Sequence) VALUES(1, 6);
INSERT INTO ProcedureCommands(ProcedureId, Sequence) VALUES(2, 4);
INSERT INTO ProcedureCommands(ProcedureId, Sequence) VALUES(2, 5);
触发脚本
CREATE TRIGGER Update_Sequence UPDATE OF Sequence ON ProcedureCommands FOR EACH ROW
BEGIN
UPDATE ProcedureCommands
SET Sequence = CASE WHEN Sequence >= new.Sequence THEN Sequence = Sequence + 1 ELSE Sequence END
WHERE ProcedureId = new.ProcedureId;
END;
不幸的是,所写的触发器不起作用。如何在 inserts/updates 之后有条件地递增字段?
处理新记录的触发器是 INSERT 触发器。
Sequence = Sequence + 1
比较两个值,returns比较的结果。在这种情况下,这两个值永远不会相等,因此结果始终为零。
并且您不想更新插入的行本身,因此您必须使用 >
而不是 >=
。
如果不想更新某些行,将过滤器放在 WHERE 子句中会更容易:
CREATE TRIGGER Update_Sequence
AFTER INSERT ON ProcedureCommands
FOR EACH ROW
BEGIN
UPDATE ProcedureCommands
SET Sequence = Sequence + 1
WHERE ProcedureId = new.ProcedureId
AND Sequence > new.Sequence;
END;