繁体   English   中英

MySQL在同一表的触发器上删除

[英]MySQL Delete on Trigger in same table

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

如:

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

这样,我只保留每个val2的最大val1

我已经在PostgreSQL中做到了,但是我找不到在MySQL中完成的方法。

否,MySQL不允许这样做,请参阅对存储程序的限制

存储的函数或触发器无法修改调用该函数或触发器的语句已在使用(用于读取或写入)的表。

如果col2为非null,并且您只想保留一行(而不是几行可能具有相同的最大值),则可以通过在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可以为null ,则此方法将不起作用,因为它不会违反唯一约束。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM