MySQL在同一个表中的Trigger上删除

时间:2017-01-12 15:12:27

标签: mysql sql triggers

在调用触发器时,我可以删除表中的行吗?

如:

insert into table1 (col1, col2, col3) values (val1, val2, val3);

CREATE DEFINER=`root`@`localhost` TRIGGER `db`.`trig_name` BEFORE INSERT ON `table1` FOR EACH ROW
BEGIN
if (new.val1 > (select val1 from table1 where val2 = new.val2 limit 1))
    delete from table1 where val2 = new.val2;
end if;
END

这样我每val1只保留最多val2

我在PostgreSQL中做过这个,但我找不到在MySQL中完成的方法。

1 个答案:

答案 0 :(得分:0)

不,MySQL不允许这样做,请参阅Restrictions on Stored Programs

  

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

如果col2非空,并且您只想保留一行(而不是几行可能具有相同的最大值),则可以通过在{{上使用唯一索引来实现相同的结果1}},例如将它作为主键,然后使用

col2

插入您的值(并且没有触发器)。

insert into table1 (col1, col2, col3) values (val1, val2, val3) on duplicate key update col3 = case when col1 >= values(col1) then col3 else values(col3) end, col1 = greatest(values(col1), col1); 最多保留一行,如果新行的col2值较高,则使用新值更新。如果col1可以是col1,请在比较中使用null。 (如果coalesce可以是col2,则此方法无效,因为它不会违反唯一约束。)