単純にifで場合分けするだけでしょうね、以下例
//元データ
create table tbl (id int not null auto_increment primary key,data varchar(30),flg tinyint not null);
insert into tbl(id,data) values(1,'a'),(2,'b'),(3,'c');
select * from tbl;
id,data,flg
1,a,0
2,b,0
3,c,0
//id=4,dataを'x'を挿入
insert into tbl (id,data) values(4,@data:='x')
on duplicate key update data=if(flg=0,@data,data);
select * from tbl;
id,data,flg
1,a,0
2,b,0
3,c,0
4,x,0
//id=4のdataを'y'に更新、ただしflgが0の場合→flgは0なので更新
insert into tbl (id,data) values(4,@data:='y')
on duplicate key update data=if(flg=0,@data,data);
select * from tbl;
id,data,flg
1,a,0
2,b,0
3,c,0
4,y,0
//id=4のdataを'z'に更新、ただしflgが1の場合→flgは0なので更新されない
insert into tbl (id,data) values(4,@data:='z')
on duplicate key update data=if(flg=1,@data,data);
select * from tbl;
id,data,flg
1,a,0
2,b,0
3,c,0
4,y,0
お礼
回答有難うございます。 なるほど on duplicate key update のあとに ifをつけれるのですね。