MySQL replace into 和insert into on duplicate key update用法

replace into 用法

在向表中插入数据的时候,经常遇到这样的情况:
1. 首先判断数据是否存在;
2. 如果不存在,则插入;
3. 如果存在,则更新。

在 SQL Server 中可以这样处理:

if not exists (select 1 from t where id = 1)
      insert into t(id, update_time) values(1, getdate())
   else
      update t set update_time = getdate() where id = 1

那么 MySQL 中如何实现这样的逻辑呢?别着急!MySQL 中有更简单的方法: replace into

replace into t(id, update_time) values(1, now());

replace into t(id, update_time) select 1, now();

replace into 跟 insert 功能类似,不同点在于
replace into 首先尝试插入数据到表中, 1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。

注意:插入数据的表必须有主键或者是唯一索引否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。

MySQL replace into 有三种形式:

1. replace into tbl_name(col_name, ...) values(...)
2. replace into tbl_name(col_name, ...) select ...
3. replace into tbl_name set col_name=value, ...

前两种形式用的多些。其中 “into” 关键字可以省略,不过最好加上 “into”,这样意思更加直观。另外,对于那些没有给予值的列,MySQL 将自动为这些列赋上默认值。

insert on duplcate key update 用法

replace intoon duplcate key update都是只有在primary key或者unique key冲突的时候才会执行。
如果数据存在,replace into则会将原有数据删除,再进行插入操作,这样就会有一种情况,如果某些字段有默认值,但是replace into语句的字段不完整,则会设置成默认值。
on duplicate key update则是执行update后面的语句
下面我们来看一个例子来说明。

CREATE TABLE mytest(
	id INT NOT NULL AUTO_INCREMENT,
	username VARCHAR(32) NOT NULL,
	password VARCHAR(32) DEFAULT NULL,
	PRIMARY KEY(id),
	UNIQUE KEY(col1)
);

在这里插入图片描述

插入一条测试数据:

INSERT INTO mytest VALUES (NULL, 'admin', '123456');

在这里插入图片描述

执行replace into:

replace into test(username) values ('unique');

在这里插入图片描述

重点: 可以看到id的值增加了 1,并且 password 的值变为了NUll,说明在出现冲突的情况下,使用replace into只是先delete掉原来的数据,再执行insert操作,如果新的insert语句不完成,会将其余字段设置为默认值。

现在我们将数据还原:

UPDATE mytest SET PASSWORD = '123456' WHERE username = 'admin';

在这里插入图片描述
执行on duplicate key update:

insert into mytest values(null, 'admin', '654321') on duplicate key update username = 'update_admin';

在这里插入图片描述
可以看到 id 没有变化,password 的值也没有变化,只有username 的值发生了变化,说明在出现冲突的情况下,on duplicate key update只是执行了update后面的语句

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值