這將允許值保持不變:
CREATE TRIGGER transition BEFORE UPDATE ON tbl
FOR EACH ROW
BEGIN
IF (OLD.value = 1 AND NEW.value NOT IN (1, 2))
OR (OLD.value = 2 AND NEW.value NOT IN (2, 3))
THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Incorrect transition of values';
END IF;
END//
我測試了這一點:
mysql> insert into tbl set value=1, other=11;
Query OK, 1 row affected (0.00 sec)
mysql> update tbl set other=22;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update tbl set value=1, other=33;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update tbl set value=2, other=44;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update tbl set value=1, other=55;
ERROR 1644 (45000): Incorrect transition of values
mysql> update tbl set value=2, other=66;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update tbl set value=2, other=77;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update tbl set value=3, other=88;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
但之後的值是3,會發生什麼?它可以變成任何東西,還是必須保持3?您可能需要另一個術語來測試。
感謝您的回答,但我希望能夠從1 - > 2或2 - > 3更改該特定列中的值,但拒絕任何不符合該轉換的更改(例如,1 - > 3 [UPDATE tbl SET value = 3 WHERE value = 1,應該被拒絕)。目前,我的觸發器管理着這一點,但問題是我無法更新表格中的任何其他列,即使它們沒有更改「值」中的任何內容。我怎樣才能解決這個問題? – Olivier
我提供的解決方案符合您的需求。我編輯了我的答案,上面包含了一個測試演示。 –
我的歉意,我誤解了。完美的作品,謝謝! – Olivier