INSERT
[INTO] tbl_name
[PARTITION (partition_name,...)]
SET col_name={expr | DEFAULT}, ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
或者:
复制代码 代码如下:
INSERT
[INTO] tbl_name
[PARTITION (partition_name,...)]
[(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
可见,还是原来insert语句的写法。
举个栗子:
1.使用刚才新建的test_tab表,此时表中的数据如下:
复制代码 代码如下:
name|age
:—-|:—
zhangsan|24
2.使用主键相同的insert语句,仍然会duplicate key错误
复制代码 代码如下:
insert into `test_tab` (`name`,`age`) values ('zhangsan',50) ;
------------
[Err] 1062 - Duplicate entry 'zhangsan' for key 'PRIMARY'
3.对刚才的insert语句添加 on duplicate key update … 关键字:
复制代码 代码如下:
insert into `test_tab` (`name`,`age`) values ('zhangsan',50)
ON DUPLICATE KEY UPDATE `age`=50 ;
------------
受影响的行: 2
时间: 0.025s
4.此时主键为'zhangsan'的数据,age字段已被更新:
复制代码 代码如下:
name|age
:—-|:—
zhangsan|50
5.当然,如果主键不冲突,效果跟一般插入语句是一样的:
复制代码 代码如下:
insert into `test_tab` (`name`,`age`) values ('lisi',30)
ON DUPLICATE KEY UPDATE `age`=30 ;
------------
受影响的行: 1
时间: 0.009s
复制代码 代码如下:
name|age
:—-|:—
zhangsan|50
lisi|30
不存在则插入,存在则更新,其二(使用replace语句实现)
save or update 在mysql中还有另一种实现,即replace into语句,它用起来有点像Oracle的Merge。判断数据重复的逻辑依然是主键或者唯一键冲突。Mysql官方文档中提供标准的语法:
复制代码 代码如下: