慎用replace into

不记得是在哪里看到说replace into的工作流程是根据主键或者唯一索引来判断记录是否存在,不存在就插入,存在则更新.

然后在框架的orm里面针对mysql的驱动实现了一个replace的方法,而然今天使用的时候出现了问题:

mysql> select * from tbl_user;
+----+--------+--------+
| id | name   | status |
+----+--------+--------+
|  1 | eslizn |      0 |
+----+--------+--------+
1 row in set (0.00 sec)

这里是当前表数据,然后我需要更新这条记录的status字段,但是我不确定这条id=1的记录是否存在,于是我使用replace into:

mysql> replace into tbl_user (id, status) values (1, 1);
Query OK, 2 rows affected (0.00 sec)

是不是哪里不对?受影响的行数为何为2?我们再看下数据:

mysql> select * from tbl_user;
+----+------+--------+
| id | name | status |
+----+------+--------+
|  1 | NULL |      1 |
+----+------+--------+
1 row in set (0.00 sec)

可以看到name已经变成null,其原因就是replace into并非是存在则更新,而是存在则删除并插入.

在mysql里不存在就写入,存在则更新的正确写法是这样:

insert into tbl_user (id, status) values (1, 1) on duplicate key update status = 1;

主键冲突时则更新

附上oracle的merge into:

merge into tbl_user using (
    select
        count (*) as nums
    from
        tbl_user
    where
        tbl_user.pid = 'pid'
) p on (p.nums <> 0)
when matched then update set tbl_user.status = 1 where tbl_user.pid = 'pid'
when not matched then insert (tbl_user.pid, tbl_user.status) values ('pid', 1);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

深入原理:分区剪裁特性剖析

小鱼(邓秋爽) 云和恩墨专家,有超过5年超大型数据库专业服务经验,擅长oracle 数据库优化,SQL优化和troubleshooting 编辑手记:深入学习...

3607
来自专栏「3306 Pai」社区

MySQL 8.0用户和角色管理

MySQL8.0新加了很多功能,其中在用户管理中增加了角色的管理,默认的密码加密方式也做了调整,由之前的sha1改为了sha2,同时加上5.7的禁用用户和用户过...

2840
来自专栏pangguoming

MyBatis两张表字段名相同产生的问题

MyBatis两张表字段名相同, 会导致bean属性都映射为第一个表的列, 解决方法: 通过设置别名的方式让其产生区别,如 <select id="queryB...

4967
来自专栏Java后端技术栈

MySQL日志文件之错误日志和慢查询日志详解

实验环境:MySQL Community Server (GPL) 5.7.17、Ubuntu 16.04

1321
来自专栏乐沙弥的世界

MySQL 通用查询日志(General Query Log)

    同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分。MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志,慢查询日...

5473
来自专栏Hongten

python开发_count()

功能:读取一个文件'c:\\test.txt',统计出该文件中出现字符'a'的次数

1411
来自专栏WindCoder

Discuz!X3.1QQ互联Unknown column 'conuintoken' in 'field list'的解决办法

1291
来自专栏别先生

主要是解决,作为一个数据共享的数据库,存在的数据库统计,然后将计算的数据量输出到自己使用的数据库,进行主页面展示。

1、主要是解决,作为一个数据共享的数据库,存在的数据库统计,然后将计算的数据量输出到自己使用的数据库,进行主页面展示。

1012
来自专栏互联网杂技

mysql命令之对用户,库,表操作--基础教程(三)

创建用户: 进入在root用户进行操作: CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456'; 授权...

35111
来自专栏杨建荣的学习笔记

关于move tablespace的问题总结(r2笔记50天)

现在得到一个需求,需要把生产环境的多个schema下的表结构复制到测试环境中的一个schema下。 生产环境和测试i环境的表空间配置都不一样。 目前可以考虑用如...

2875

扫码关注云+社区

领取腾讯云代金券