在调用触发器时,我可以删除表中的行吗?
如:
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中完成的方法。
答案 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
,则此方法无效,因为它不会违反唯一约束。)