如果列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 ;
除了不执行更新语句外,一切正常。
ADDED
在PhpMyAdmin中尝试了这个,我收到了这个错误:
1442 - 无法更新存储函数/触发器中的表'myTable',因为它已被调用此存储函数/触发器的语句使用。
我可以通过为D列创建一个单独的表来解决这个问题,但将它放在同一个表中会很好。
额外的问题:当我使用mysqli从我的网站插入内容时,如何显示此错误?
答案 0 :(得分:3)
正如Restrictions on Stored Programs所述:
存储的函数或触发器不能通过调用函数或触发器的语句修改已经使用(用于读取或写入)的表。
如果只想在新插入的行中增加D
,则只需要SET NEW.D = NEW.D + 1;
。如果您希望为每个“冲突”记录增加D
,则需要将D
存储在其他(相关)表中。例如,您可以将列D
存储在单独的表中,其中FK (A, B, C)
返回myTable
。
然而,人们不禁怀疑是否有更好的方法来实现您的总体目标:您尝试使用此触发器解决的业务问题究竟是什么?谨防XY problem。