[英]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.