1

如果列 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 从我的网站插入内容时,如何显示此错误?

4

1 回答 1

3

对存储程序的限制中所述

存储的函数或触发器不能修改已被调用函数或触发器的语句使用(用于读取或写入)的表。

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

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

于 2012-10-14T22:26:15.980 回答