前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >慎用replace into

慎用replace into

作者头像
码农二狗
发布2018-06-29 10:16:37
3K0
发布2018-06-29 10:16:37
举报
文章被收录于专栏:码农二狗码农二狗

不记得是在哪里看到说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);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档