平时我们在设计数据库表的时候总会设计 unique 或者 给表加上 primary key 的限制条件.
如果插入数据的时候,经常会有这样的需求,我们想往数据库中插入一条记录,若数据表中存在相同的主键记录,我们就更新该条记录, 否则就插入一条新的记录。
逻辑上我们需要怎么写(伪代码):
$result = mysql_query(‘select * from xxx where id = 1’);
row=mysqlfetchassoc(row = mysql_fetch_assoc(row=mysqlfetchassoc(result);
if($row){
mysql_query(‘update …’);
}else{
mysql_query(‘insert …’);
}
但是这样写有两个问题:
1、效率太差,每次执行都要执行2个sql
2、高并发的情况下数据会出问题,不能保证原子性
还好MySQL 为我们解决了这个问题:我们可以通过 ON DUPLICATE KEY UPDATE 达到以上目的, 且能保证操作的原子性和数据的完整性。
ON DUPLICATE KEY UPDATE 的作用:
向数据库中插入一条记录,若该数据的主键值/ UNIQUE KEY 已经在表中存在,则执行更新操作, 即UPDATE 后面的操作。否则插入一条新的记录。
举个栗子
id 为主键