Manage INSERT failures

from the Artful MySQL Tips List


Often the spec requires that if an INSERT fails, the existing row be updated. A failed INSERT IGNORE cannot trigger an UPDATE, but as the following script shows, INSERT...ON DUPLICATE KEY... can:

DROP TABLE IF EXISTS log,ti,tm;

CREATE TABLE log (a varchar(200));

CREATE TABLE ti (a int PRIMARY KEY default 0, b int) ENGINE=InnoDB;
create trigger ti1 before insert on ti
  for each row insert into log select concat("ti before insert ",new.a,',',new.b);
create trigger ti2 after insert on ti
  for each row insert into log select concat("ti after insert ",new.a,',',new.b);
create trigger ti3 before update on ti
  for each row insert into log select concat("ti before update ",new.a,',',new.b);
create trigger ti4 after update on ti
  for each row insert into log select concat("ti after update ",new.a,',',new.b);

CREATE TABLE tm (a int PRIMARY KEY default 0, b int) ENGINE=MyIsam;
create trigger tm1 before insert on tm
  for each row insert into log select concat("tm before insert ",new.a,',',new.b);
create trigger tm2 after insert on tm
  for each row insert into log select concat("tm after insert ",new.a,',',new.b);
create trigger tm3 before update on tm
  for each row insert into log select concat("tm before update ",new.a,',',new.b);
create trigger tm4 after update on tm
  for each row insert into log select concat("tm after update ",new.a,',',new.b) ;
  
insert into ti  select 1,1;
select * from log; 
insert into ti  select 1,1;
select * from log; 
insert IGNORE into ti  select 1,1;
select * from log; 
insert into ti  select 1,1 ON DUPLICATE KEY UPDATE b=b+1;
select * from log;

delete from log;

insert into tm  select 1,1;
select * from log; 
insert into tm  select 1,1;
select * from log; 
insert IGNORE into tm  select 1,1;
select * from log; 
insert into tm  select 1,1 ON DUPLICATE KEY UPDATE b=b+1;
select * from log;


Return to the Artful MySQL Tips page