2015-04-22 2 views
1

У меня есть столбец, который я хотел бы увеличить на основе недавно вставленных/обновленных записей, но то, что у меня до сих пор, не работает.SQLite Trigger для увеличения значений условно

Таким образом, у моей таблицы ProcedureCommands есть столбец Sequence, который является целым числом. Всякий раз, когда создается новая запись со значением 5 Sequence, например, я хотел бы все записи, которые имеют тот же ProcedureId и Sequence значение> = 5 будет увеличивается на 1.

Таблица Script

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); 

Trigger Script

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; 

К сожалению, триггер, как написано не работает. Как я могу условно увеличить поле после вставки/обновления?

ответ

2

Триггер, который обрабатывает новые записи, является триггером INSERT.

Sequence = Sequence + 1 сравнивает два значения и возвращает результат сравнения. В этом случае два значения никогда не могут быть равны, поэтому результат всегда равен нулю.

И вы не хотите обновлять вставленную строку, поэтому вы должны использовать > вместо >=.

Если вы не хотите, чтобы обновить несколько строк, то проще поставить фильтр в предложении 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; 
+0

триггер Insert прекрасно работает. Я смог использовать> =, добавив дополнительный фильтр 'ProcedureCommandId! = New.ProcedureCommandId'. Я все еще смущен тем, как заставить это работать должным образом после обновления. Я попытался следующие, но поля получить увеличивается в несколько раз, а не на 1 'CREATE TRIGGER Refresh_Sequence_Update ОБНОВЛЕНИЕ последовательности на ProcedureCommands НАЧАТЬ UPDATE ProcedureCommands SET Sequence = Последовательность + 1 WHERE ProcedureId = new.ProcedureId И Sequence> = new.Sequence И ProcedureCommandId! = New.ProcedureCommandId; END; ' – wesmantooth

+1

Отключить [рекурсивные триггеры] (http://www.sqlite.org/pragma.html#pragma_recursive_triggers). (Что, однако, может потребоваться для других триггеров в вашей БД.) –

+0

Благодарим вас за ответ, но, похоже, мне не повезло. Я использую C# Entity Framework, который, похоже, не поддерживает прямую поддержку инструкции PRAGMA для рекурсивных триггеров (она не указана в свойствах интерфейса GUI и добавление вручную к строке подключения не изменяет поведение). – wesmantooth

Смежные вопросы