【问题标题】:MySQL: Update column with TRIGGER BEFORE INSERTMySQL:在插入之前使用 TRIGGER 更新列
【发布时间】:2012-10-14 17:04:37
【问题描述】:

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

【问题讨论】:

    标签: mysql triggers sql-update


    【解决方案1】:

    Restrictions on Stored Programs 中所述:

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

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

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

    【讨论】:

    • 我想要实现的基本答案是我有一个表,您只能在其中添加数据。然后,如果第三列等于特定值,我想使两列之间的组合唯一。如果再次插入相同的数据,我希望计数器每次都增加。
    • @Oskwish:这是您要解决的技术问题,而不是潜在的业务问题。你为什么要这样做?请阅读解释 XY 问题的链接。
    猜你喜欢
    • 2010-11-22
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    相关资源
    最近更新 更多