认知幻像:在不同数据库之间迁移时,总有些什么改变了?

2024-01-13 08:59

本文主要是介绍认知幻像:在不同数据库之间迁移时,总有些什么改变了?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当我们在不同数据库之间迁移时,总有一些认知幻像,下意识的以为,某些事应该还是那样

但是事实上,有些事情永远的改变了,我们需要认识到这些变化,并且刷新认知。

最近有朋友在“云和恩墨大讲堂”的微信群提出了一个这样的问题,以下SQL的输出结果是什么?

create table enmotest (a int, b int );

insert into enmotest values(1,1);

update enmotest set a=a+1,b=b+a;

select * from enmotest;

要想回答这个问题,首先要跳出自我熟悉的认知,例如,Oracle 和 MySQL DBA看到的答案可能完全不同。而两者又很可能不熟悉另外一种数据库的工作原理,甚至缺少触手可得的验证环境。

现在借助墨天轮的 SQLRUN 工具,一切都非常简单,尝鲜地址:

        https://modb.pro/sqlrun

我们验证一下不同数据库的表现。

1. Oracle 数据库,对于 Oracle 开发者很熟悉,结果可想而知是 (2,2)

06bf23d3ee1f7568ac4459cda04f7247.png

2. MogDB 数据库,和O表达相同,结果是 (2,2)

5c66b90f1cf6841abbe1e35621ce85c4.png

3. MySQL 数据库,这会让Oracle开发者惊讶,结果是(2,3)

37f9a9edde3cc3c75017aeb6a0d6fc7e.png

4. OceanBase 数据库,表达和 MySQL 一致,结果是(2,3)

e44c151e1dae0392d337713db9638fd0.png

在国产数据库的替代过程中,开发者也一定要深入了解不同数据库的细微差异,以避免因为简单的疏忽而产生严重的生产事故。

2023 数据技术嘉年华大会,将会在4.7 ~ 4.8 北京开幕,大会特设数据迁移专场,欢迎接受我的赠票邀请(扫码),共享数据库技术盛会,免费报名链接:

https://modb.pro/event/804/395289

对于上面的用例,通过 MySQL 的 Binlog 日志,还可以进一步审视后台的工作逻辑。

#230331 11:20:52 server id 1  end_log_pos 975 CRC32 0x67f56d5b  Update_rows: table id 95 flags: STMT_END_F

### UPDATE `enmotech`.`enmotest`

### WHERE

###   @1=1

###   @2=1

### SET

###   @1=2

###   @2=3

# at 975

#230331 11:20:52 server id 1  end_log_pos 1006 CRC32 0x72b8ef24         Xid = 31

这就是 MySQL 的工作原理,在手册上有这样一段说明:

> Single-table UPDATE assignments are generally evaluated from left to right. For multiple-table updates, there is no guarantee that assignments are carried out in any particular order.

> If you set a column to the value it currently has, MySQL notices this and does not update it.

MySQL 单表更新赋值,通常是从左到右计算,这样先完成的计算结果就会影响后面的计算。对于多表更新,不保证按任何特定的顺序执行分配。

如果 update 赋值前后的结果不变, MySQL 不会执行update, 所以不能通过SQL影响行数来判断业务逻辑的执行情况。

这些行为都和Oracle完全不同


云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看” 

你的喜欢会被看到❤

这篇关于认知幻像:在不同数据库之间迁移时,总有些什么改变了?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600919

相关文章

MySQL数据目录迁移的完整过程

《MySQL数据目录迁移的完整过程》文章详细介绍了将MySQL数据目录迁移到新硬盘的整个过程,包括新硬盘挂载、创建新的数据目录、迁移数据(推荐使用两遍rsync方案)、修改MySQL配置文件和重启验证... 目录1,新硬盘挂载(如果有的话)2,创建新的 mysql 数据目录3,迁移 MySQL 数据(推荐两

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

MySQL MHA集群详解(数据库高可用)

《MySQLMHA集群详解(数据库高可用)》MHA(MasterHighAvailability)是开源MySQL高可用管理工具,用于自动故障检测与转移,支持异步或半同步复制的MySQL主从架构,本... 目录mysql 高可用方案:MHA 详解与实战1. MHA 简介2. MHA 的组件组成(1)MHA

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

通过DBeaver连接GaussDB数据库的实战案例

《通过DBeaver连接GaussDB数据库的实战案例》DBeaver是一个通用的数据库客户端,可以通过配置不同驱动连接各种不同的数据库,:本文主要介绍通过DBeaver连接GaussDB数据库的... 目录​一、前置条件​二、连接步骤​三、常见问题与解决方案​1. 驱动未找到​2. 连接超时​3. 权限不

MySQL数据库读写分离与负载均衡的实现逻辑

《MySQL数据库读写分离与负载均衡的实现逻辑》读写分离与负载均衡是数据库优化的关键策略,读写分离的核心是将数据库的读操作与写操作分离,本文给大家介绍MySQL数据库读写分离与负载均衡的实现方式,感兴... 目录读写分离与负载均衡的核心概念与目的读写分离的必要性与实现逻辑读写分离的实现方式及优缺点读负载均衡

Go语言中如何进行数据库查询操作

《Go语言中如何进行数据库查询操作》在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三... 查询函数QueryRow和Query详细对比特性QueryRowQuery返回值数量1个:*sql

Mysql数据库聚簇索引与非聚簇索引举例详解

《Mysql数据库聚簇索引与非聚簇索引举例详解》在MySQL中聚簇索引和非聚簇索引是两种常见的索引结构,它们的主要区别在于数据的存储方式和索引的组织方式,:本文主要介绍Mysql数据库聚簇索引与非... 目录前言一、核心概念与本质区别二、聚簇索引(Clustered Index)1. 实现原理(以 Inno

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代