gpt4 book ai didi

MySQL:在插入之前使用 TRIGGER 更新列

转载 作者:行者123 更新时间:2023-11-29 05:33:18 24 4
gpt4 key购买 nike

如果 C 列等于特定值,我有这个代码可以防止重复

DELIMITER $$

CREATE TRIGGER special_unique_test BEFORE INSERT ON myTable
FOR EACH ROW BEGIN
IF NEW.C = 'x' AND EXISTS (
SELECT * FROM myTable WHERE A = NEW.A AND B = NEW.B AND C = 'x'
)THEN

UPDATE myTable SET D = D + 1 WHERE A = NEW.A AND B = NEW.B AND C = 'x';

END IF;
END$$

DELIMITER ;

除了不执行更新语句外,一切正常。

已添加

在 PhpMyAdmin 中试过这个,我得到了这个错误:

1442 - 无法更新存储函数/触发器中的表“myTable”,因为它已被调用此存储函数/触发器的语句使用。

我可以通过为 D 列创建一个单独的表来解决这个问题,但最好将它放在同一个表中。

附加问题:当我使用 mysqli 从我的网站插入内容时,如何显示此错误?

最佳答案

根据 Restrictions on Stored Programs 记录:

A stored function or trigger cannot modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger.

如果您只想在新插入的行中增加D,您只需要SET NEW.D = NEW.D + 1;。如果您希望为每个“冲突”记录递增 D,则需要将 D 存储在其他(相关)表中。例如,您可以将列 D 存储在一个单独的表中,并使用 FK (A, B, C) 返回到 myTable.

然而,人们不禁想知道是否有更好的方法来实现您的总体目标:您尝试使用此触发器解决的业务问题到底是什么?当心 XY problem .

关于MySQL:在插入之前使用 TRIGGER 更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12884496/

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