表结构如下:create table test.t2
(
id int primary key not null,
col int not null
)engine=myisam default charset=gbk;
如果执行下面的代码:insert into test.t2
(
id,
col
)
values (1,1);
由于id列为主键一定会报错。但是当我们在后面加上ON DUPLICATE KEY UPDATE,会怎么样呢?insert into test.t2
(
id,
col
)
values (1,1)
on duplicate key update col=col+1;
你会惊奇的发现,代码可以执行,没有报错。奇迹是怎么样发生的呢?原来这是MySQL特有的语法,ON DUPLICATE KEY UPDATE的意思就是当发生重复值的时候,就执行UPDATE后面的代码。现在id=1的记录已经存在,那么就满足了出现重复值的条件,所以这段代码其实执行的是col=col+1,自然结果就等于2了。
简单吧。不要以为ON DUPLICATE KEY UPDATE就这点能耐,再来看下面这段代码:insert into test.t2
(
id,
col
)
values (1,1),(1,2)
on duplicate key update col=col+1;
先别急着看结果,想想应该会出现什么?对了对了,col列现在的值是4了:
WHY?因此这次values后面有两组值,都满足出现重复值的条件,因此update col=col+1也被执行了2次,所以col现在是4了。
呵呵,还有更高级的功能呢,请看下面的代码:insert into test.t2
(
id,
col
)
values (1,3),(1,7)
on duplicate key update col=values(col);
这次也来想想,结果会是怎样的?
没想到吧,可以如此灵活使用,基本上可以弥补MySQL没有Merge语法的功能了(只是没有对删除的处理)。
适用于判断是否存在记录,如果不存在则添加,存在则修改的场景。