本文由 简悦 SimpRead 转码, 原文地址 www.cnblogs.com
replace into
做项目是遇到这样一个问题,把查询出的数据插入到一个新表里面,没有的话新增,有的话更新
如果先删除再插入的话效率不高,
如果对比两端的数据,相同的更新,没有的插入,这效率也不高
mysql 有一个 replace into
首先尝试插入数据到表中, 1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。
要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。
测试
新建一个 test 表,三个字段,id,title,uid,
id 是自增的主键,uid 是唯一索引;
插入两条数据
insert into test(title,uid) VALUES ('123465','1001');
insert into test(title,uid) VALUES ('123465','1002');
使用 replace into 插入数据时:
REPLACE INTO test(title,uid) VALUES ('1234657','1003');
当前数据库 test 表所有数据如下:新增了三条数据
当 uid 存在时,使用 replace into 语句
REPLACE INTO test(title,uid) VALUES ('1234657','1001');
受影响的行: 2
时间: 0.140s
uid是唯一索引,replace into发现uid=1001的记录存在,先删除这条数据,也就是id=1的记录。然后插入新的记录。
MySQL replace into 有三种形式:
- replace into tbl_name(col_name, …) values(…)
- replace into tbl_name(col_name, …) select …
- replace into tbl_name set col_name=value, …
第一种形式类似于 insert into 的用法,
第二种 replace select 的用法也类似于 insert select,这种用法并不一定要求列名匹配,事实上,MYSQL 甚至不关心 select 返回的列名,它需要的是列的位置。例如,replace into tb1(name, title, mood) select rname, rtitle, rmood from tb2;? 这个例子使用 replace into 从? tb2 中将所有数据导入 tb1 中。
第三种 replace set 用法类似于 update set 用法,使用一个例如 “SET col_name = col_name + 1” 的赋值,则对位于右侧的列名称的引用会被作为 DEFAULT(col_name)处理。因此,该赋值相当于 SET col_name = DEFAULT(col_name) + 1。
前两种形式用的多些。其中 “into” 关键字可以省略,不过最好加上 “into”,这样意思更加直观。另外,对于那些没有给予值的列,MySQL 将自动为这些列赋上默认值。
laravel中replace into使用
执行原生SQL
DB::insert(“replace into test(id, test) values(1, now());”);