MySQL中的insert into 与replace into用法和区别

我们先来看下MySQL官网对于两者的解释:

然后用一个小实例简单说明下:

replace into 和insert into都是基于唯一索引或主键基础上使用的,必须有主键或唯一索引

首先创建一张test表

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `id` bigint(20) NOT NULL COMMENT '主键ID',
  `name` varchar(50) DEFAULT NULL,
  `phone` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试表';

执行单条语句测试

--执行单条数据的insert into
[SQL]INSERT INTO test (id, NAME, phone) VALUES('1', '张三', '13810597914');
受影响的行: 1
时间: 0.024s

--执行单条数据的replace into
[SQL]REPLACE INTO test (id, NAME, phone) VALUES('2', '李四', '13810597915');
受影响的行: 1
时间: 0.023s

由上可见: 当主键和唯一索引 'id' 列不重复,两者执行时间及影响行数(插入的方式)基本等同

--再来看看主键重复的情况 
--1、执行insert into
[SQL]INSERT INTO test (id, NAME, phone) VALUES('2', '李四san', '13810597915');
[Err] 1062 - Duplicate entry '2' for key 'PRIMARY'

--2、执行replace into
[SQL]REPLACE INTO test (id, NAME, phone) VALUES('2', '李四san', '13810597915');
受影响的行: 2
时间: 0.026s

可以看到inset into是不允许添加主键重复列的,而replace可以,且影响行数是2,再结合MySQL官网的文档解释是不是就清晰了,replace into用于不知道操作为更新还是新增的时候,使用时,先尝试直接向库中插入数据,遇到主键或唯一索引而引发的重复键错误时,删除掉冲突行并再次尝试插入,这个过程是MySQL自行处理的,并不会存在用户感知之类的

再说下MySQL replace into 的三种使用形式:

1. replace into test(id,name ...) values(...)

2. replace into test(id,name, ...) select ...

3. replace into test set id=value, name=value,...

第一种形式类似于insert into的用法,

第二种replace select的用法也类似于insert select,这种用法并不一定要求列名匹配,事实上,MYSQL甚至不关心select返回的列名,它需要的是列的位置。例如,replace into test ( id, name, phone) select id, name, address from test2;?这个例子使用replace into从?test2中将所有数据导入test1中。

第三种replace set用法类似于update set用法,使用一个例如“SET col_name = col_name + 1”的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。

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

最后总结一下吧:

replace into执行过程主键冲突总是删除后插入新记录

replace into主键相同,主键之外字段会得到更新,主键不同功能同insert into 

replace into和insert into区别在于insert into插入与主键相同记录会报错而前者不会

  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
load into 和 insert into 都是 MySQL 数据库用于将数据插入表的语句,但它们在使用方法和适用场景上有一些区别。 load into 语句用于将数据从一个文件加载到表,通常适用于大批量导入数据。其语法如下: ``` LOAD DATA [LOCAL] INFILE 'file_name' [REPLACE | IGNORE] INTO TABLE table_name [CHARACTER SET charset_name] [FIELDS [TERMINATED BY 'field_separator'] [[OPTIONALLY] ENCLOSED BY 'enclosure_character'] [ESCAPED BY 'escape_character'] ] [LINES [STARTING BY 'line_prefix'] [TERMINATED BY 'line_separator'] ] [IGNORE number LINES] [(column1, column2, ..., column_n)]; ``` 其,file_name 是数据文件的路径,table_name 是要插入数据的表名,charset_name 是字符集,fields 用于指定字段的分隔符和边界符,lines 用于指定行分隔符和前缀符,ignore 可以用于忽略文件的前几行,column1 到 column_n 则是要插入数据的列名列表。 而 insert into 语句则是将数据直接插入到表,通常适用于少量数据的插入。其语法如下: ``` INSERT INTO table_name [(column1, column2, ..., column_n)] VALUES (value1, value2, ..., value_n); ``` 其,table_name 是要插入数据的表名,column1 到 column_n 是要插入数据的列名列表,value1 到 value_n 则是要插入的数据值。 因此,load into 和 insert into 的主要区别在于使用场景和数据量大小。如果需要导入大量数据,通常使用 load into;如果数据量较小,则使用 insert into。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默慊$

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值