美文网首页
MySQL 交换两列值

MySQL 交换两列值

作者: Chaos_John | 来源:发表于2020-12-13 21:24 被阅读0次

欢迎转载,但请在开头或结尾注明原文出处【blog.chaosjohn.com】

前言

今年五月下旬的时候,公司某线上数据库遭遇表被删事件,对,没错,就是那种 删库 事件。

不过不是恶意删库事件,是某开发童鞋的不小心,而且他也没有跑路。

在发现表被删的第一时间,我就插手处理(假设表名为 sample):

  1. 先把被删的表结构重建起来,先争取线上相关业务接口不再报 502 错误
  2. 再从阿里云那边下载当日早些时候的完整数据库备份
  3. 创建本地 MySQL 环境,将被删表从完整备份中恢复到本地
  4. 等到业务高峰过去后,短暂下线 sample 表相关的服务,即 服务降级
  5. 将线上 sample 表的数据导出到 CSV 文件(包含了从删库后重建表开始到服务降级之间的所有数据)
  6. CSV 中合并增量数据到本地 sample 表(追加在尾部)
  7. 将线上 sample 表备份后删除,将本地 sample 表复制到线上
  8. 恢复服务

完美收工!!!

只不过第二天做投放的小伙伴告诉我,后台数据有错乱。我一检查,发现上述的 步骤6 出了纰漏。合并增量数据的时候,CSV 的列与 sample 表的列没对齐,即有两列交换了位置。

解决

所以,解决目标就是,对于数据表里出问题的行,要将该两列交换回来。

方案一

利用临时变量 temp,适用场景:xy 必须都不为 NULL

UPDATE sample SET x=y, y=@temp WHERE (@temp:=x) IS NOT NULL;

方案二(笔者选用的方案)

同样利用临时变量 temp,但是 xy 没有不为 NULL 的限制

UPDATE sample SET x=(@temp:=x), x=y, y=@temp;

方案三

s1 得到更新,而 s2 则用来拉取老数据(注:该方案要求表必须有主键id

UPDATE sample s1, sample s2 SET s1.x=s1.y, s1.y=s2.x WHERE s1.id=s2.id;

方案四(如果 xy 都是数值型)

UPDATE sample SET x=x+y,y=x-y,x=x-y;

相关文章

  • MySQL 交换两列值

    欢迎转载,但请在开头或结尾注明原文出处【blog.chaosjohn.com】[https://blog.chao...

  • Mysql交换两列的值

    创建一个测试的表 插入几条数据 看一下现在表的样子 输出 执行交换语句 再看一下交换后表的样子 输出 交换成功 h...

  • eggjs mysql 批量插入多条

    批量 mysql 语句如下 INSERT INTO[表名] ([列名],[列名])VALUES([列值],[列值]...

  • awk交换两列

    账号迁移之后,原账号下添加的设备id得移过来。暂时没有发现可以导出的地方,只能复制网页内容。复制后的内容如下 苹果...

  • 聊聊mysql的多列组合查询

    序 本文主要展示如何使用mysql的多列组合查询 何为多列组合查询呢,就是查询的值不再是单个列的值,而是组合列的值...

  • spark读取mysql某列值,封装成List集合

    spark读取mysql某列值,封装成List集合

  • Java基础(十一)

    MySQL 索引 优化 插入 Mysql插入值,插入一个空行(前提为not null的列得有默认值) INSERT...

  • 矩阵的PLUP分解_线性代数_day43

    不能满足高斯消元发,需要交换矩阵的两列 交换矩阵的两列,需要右乘以置换矩阵 矩阵A = P*L*U*P 进行列交换...

  • MySQL函数

    本文基于MySQL56及其以上MySQL函数分为五类: 1 - Aggregate : 基于一列的多个值返回单一值...

  • excel交换两列数据

    遵循一下步骤: 选择第一列 按住”Shift“健 移动鼠标到该列的右边界,当看到光标变成十字移动图标时,点击鼠标 ...

网友评论

      本文标题:MySQL 交换两列值

      本文链接:https://www.haomeiwen.com/subject/mfapgktx.html