gpt4 book ai didi

mysql - BEFORE UPDATE 触发器阻止所有更新

转载 作者:行者123 更新时间:2023-11-29 02:42:57 24 4
gpt4 key购买 nike

我有一个包含许多列的表,我正在尝试实现一个在特定列上更新之前起作用的触发器,以确保该特定列的值只能根据一个特定的过渡,从 1 到 2 再到 3。

例如,如果我的列中的值为 1,如果尝试将其从 1 更改为 3,则对该列的更新将被拒绝,但如果它从 1 更改为 2,则会被接受。

下面的代码有效,但是,它当前拒绝所有不符合该代码的更新。例如,如果我尝试更新该表中不同列的行,我的更新将被拒绝,即使我没有以任何方式更改值列。

DELIMITER //
CREATE TRIGGER transition BEFORE UPDATE ON tbl
FOR EACH ROW
BEGIN
IF (OLD.value = 1 AND NEW.value != 2)
OR (OLD.value = 2 AND NEW.value != 3)
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Incorrect transition of values';
END IF;
END //
DELIMITER;

我该如何解决这个问题,以便在建立转换一致性的同时仍然能够更新其他列?

我正在使用 mariadb 5.5.50。

非常感谢!

最佳答案

这将允许值保持不变:

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?您可能需要另一个术语来对此进行测试。

关于mysql - BEFORE UPDATE 触发器阻止所有更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47611118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com