例如更新一张表的数据,使用 on duplicate key update 写法
insert into va_p_ext (prodID,ext_price) select 7198,12800.00 on duplicate key update prodID=7198,ext_price=12800.00
$result = mysql_query('select * from xxx where id = 1');
$row = mysql_fetch_assoc($result);
if($row){
mysql_query('update ...');
}else{
mysql_query('insert ...');
}
这样的写法可能有如下几点缺陷:
- 少量的性能消耗。执行了两次sql,按照一条sql一去一回两次网络传输的话,那么这就是4次。
* 麻烦。一个很简单的逻辑缺要写十来行代码。 - 在高并发下会出问题。比如当我们获取到了需要的数据,在更新之前,有另外一个请求恰好删除了该条记录,我们的更新操作就没起到作用;再或者,如果我们更新操作的写法有问题,比如更新列a,我们使用
a = $row[a] + 1
而不是a = a +1
这种原子性的操作,有可能别的请求已经修改过了该字段,从而造成数据出错。
幸好,MySql考虑到了这点,提供了insert … on duplicate key update
的语法,该语法在insert的时候,如果insert的数据会引起唯一索引(包括主键索引)的冲突,即这个唯一值重复了,则不会执行insert操作,而执行后面的update操作。