我们可以使用ON DUPLICATE KEY UPDATE 这个语法(mysql特有)
INSERT INTO 表名 (
字段1,字段2,字段3
)
VALUES
(value1, value2,value3)
ON DUPLICATE KEY UPDATE
字段1=values(字段1) ;
如果要更新部分是固定值则是
字段1 = “xxxx”;
ON DUPLICATE KEY UPDATE的作用,当insert已经存在的记录时,执行Update
执行更新操作的条件是主键或者唯一索引找到要插入的数据,这样说可能有点难理解,我们来举个栗子
下面一张表person,id是唯一主键
INSERT INTO person (
id,
name,
age,
gender,
createTime,
modifyTime,
address
)
VALUES
(
1,
'张三',
10,
1,
now(),
NULL,
'四川'
) ON DUPLICATE KEY UPDATE modifyTime = now();
则通过id=1去查找数据,因为id=1不存在则插入
再次执行,因为已经存在了,所以会进行更新操作
ON DUPLICATE KEY UPDATE 后面的是更新语句
如果是固定值则使用
字段名 = "xxxx"
如果是动态值则使用
字段名 = values (xxxx)
(xxx)必须是insert中包含的字段 ,
例子
INSERT INTO person (
name,
age,
gender,
createTime,
modifyTime,
address
)
VALUES
(
'张三',
10,
1,
now(),
NULL,
'四川'
) ON DUPLICATE KEY UPDATE age= values(age);values(age)对应into中的对应字段名(大小写需要一致)
以下几种场景需要注意:
1.没有唯一主键或者唯一索引时,则永远不会进行更新操作。
2.子表多条数据有相同的数据,主键ID不作为更改依据时,需要建立唯一索引,我们建立name_address的唯一索引。
执行以下语句
INSERT INTO person (
name,
age,
gender,
createTime,
modifyTime,
address
)
VALUES
(
'张三',
10,
1,
now(),
NULL,
'广东'
) ON DUPLICATE KEY UPDATE modifyTime = now();
则可以成功更新
3.当语句中存在唯一索引和唯一主键时,以唯一主键为查找条件
注意:如果xml设置了返回主键,则只会执行insert操作