慎用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 条评论
登录 后参与评论

相关文章

来自专栏转载gongluck的CSDN博客

sscanf的高级用法 正则表达式

sscanf() - 从一个字符串中读进与指定格式相符的数据。 函数原型: int sscanf( const char *, const char *, ....

3254
来自专栏十月梦想

数组相关处理函数

********************************************************************************...

825
来自专栏Rgc

json.loads()的字符串中为单引号引发的错误

Traceback (most recent call last): File "G:/FastWorkStateServer/logs/redis_fabu....

541
来自专栏北京马哥教育

Python for 循环语句

? 文 | 糖豆 来源 | 菜鸟教程 糖豆贴心提醒,本文阅读时间4分钟,文末有秘密! Python for循环可以遍历任何序列的项目,如一个列表或者一...

3945
来自专栏软件开发 -- 分享 互助 成长

C++STL之map的基本操作

STL中基本的关联式容器有map和set,它们都是以红黑树作为其底层的结构,具有非常高的查找、删除效率,内容会按照键值自动排序。 使用map的注意事项: 1、关...

1889
来自专栏Java大联盟

Java基础之数组

803
来自专栏杂文共赏

Go中没有按引用传递

在Go中两个变量共享同一块内存区域是不可能的。但是两个变量指向的实际存储位置是可以一样的,但这不同于两个变量共享相同的存储区域。

841
来自专栏Java进阶

动物园园长 zookeeper

2787
来自专栏梧雨北辰的开发录

Python学习(4):变量与数据类型

1477
来自专栏Crossin的编程教室

【Python 第70课】lambda 表达式

Python 是一门简洁的语言,lambda 表达式则充分体现了 Python 这一特点。 lambda 表达可以被看做是一种匿名函数。它可以让你快速定义一个...

2916

扫码关注云+社区