【YashanDB知识库】YashanDB 支持MySQL多表更新语句的解决方法

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 本文介绍了在YashanDB中处理MySQL多表更新语句的方法。由于YashanDB默认不支持多表更新(报错YAS-04344),可通过启用兼容性参数`SQL_PLUGIN = 'MYSQL'`解决,或改写SQL语句实现相同功能。文章通过具体示例说明了多种改写方法,包括根据共同列更新单个或多个字段、添加过滤条件以及基于多个共同列的更新场景。涉及的表结构和数据展示了实际操作过程,帮助用户顺利迁移和使用YashanDB。

本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7664895.html?templateId=1718516

前言

MySQL支持多表更新语句,如果迁移到YashanDB,推荐通过兼容性参数来支持。如果兼容性参数支持存在问题的话,也可以按照多表更新的规则进行改写。

问题

在YashanDB默认模式下执行MySQL的多表更新语句,报错YAS-04344 multi-table update is not supported,请看示例:

SQL> update t1, t2 set t1.c2=t2.c2 where t1.c1=t2.c1;

YAS-04344 multi-table update is not supported

解决方法

YashanDB使用兼容参数

SQL> update t1, t2 set t1.c2=t2.c2 where t1.c1=t2.c1;

YAS-04344 multi-table update is not supported

SQL> ALTER SYSTEM SET SQL_PLUGIN = 'MYSQL';

Succeed.

SQL> update t1, t2 set t1.c2=t2.c2 where t1.c1=t2.c1;

1 rows affected.

改写多表更新SQL

SQL> update t1 set t1.c2=(select t2.c2 from t2 where t2.c1=t1.c1) where exists (select * from t2 where t2.c1 = t1.c1);

1 rows affected.

常见的改写方法

至于更详细的改写方法,我们举例说明。假设有两张表Area和Branches_Test,表Area定义如下:


CREATE TABLE Area(

    AREA_NO CHAR(2),

    COUNTRY_NO CHAR(2),

    AREA_NAME VARCHAR(60),

    DHQ VARCHAR(20),

    PRIMARY KEY ("AREA_NO")

)

表Area数据如下:

SQL> select * from Area;



AREA_NO COUNTRY_NO AREA_NAME DHQ

----------------- ----------------- ---------------------------------------------------------------- ----------------------------------------------------------------

01 CN 华东 Shanghai

02 CN 华西 Chengdu

03 CN 华南 Guangzhou

04 CN 华北 Beijing

05 CN 华中 Wuhan



5 rows fetched.

表Branches_Test如下:

CREATE TABLE Branches_Test(

    BRANCH_NO CHAR(4),

    BRANCH_NAME VARCHAR(200) NOT NULL ENABLE,

    ADDRESS VARCHAR(200),

    AREA_NO CHAR(2),

    COUNTRY_NO CHAR(2),

    AREA_NAME VARCHAR(60),

    DHQ VARCHAR(20),

    FOREIGN KEY (AREA_NO) REFERENCES AREA (AREA_NO),

    PRIMARY KEY (BRANCH_NO)

)

表Branches_Test数据如下:

SQL> select * from Branches_Test;



BRANCH_NO BRANCH_NAME ADDRESS AREA_NO COUNTRY_NO AREA_NAME DHQ

----------------- ---------------------------------------------------------------- ---------------------------------------------------------------- ----------------- ----------------- ---------------------------------------------------------------- ----------------------------------------------------------------

0001 深圳 03 CN

0101 上海 上海市静安区 01 CN

0102 南京 City of Nanjing 01 CN

0103 福州 01 CN

0104 厦门 Xiamen 01 CN

0401 北京 04 CN

0402 天津 04 CN

0403 大连 大连市 04 CN

0404 沈阳 04 CN

0201 成都 02 CN

0501 武汉 05 CN

0502 长沙 05 CN



12 rows fetched.

表Area和Branches_Test共同列是AREA_NO。根据共同列AREA_NO的值,我们会按照表Area的列AREA_NAME和DHQ的值来更新表Branches_Test的列AREA_NAME和DHQ。

1、根据B表的1个共同列来更新A表的1个列

MySQL多表更新语句:

update Branches_Test a, Area b set a.AREA_NAME = select b.AREA_NAME where b.AREA_NO = a.AREA_NO;

YashanDB改写语句:

update Branches_Test a set a.AREA_NAME = (select b.AREA_NAME from Area b where b.AREA_NO = a.AREA_NO) where exists (select * from Area b where b.AREA_NO = a.AREA_NO);

说明:根据表Branches_Test表和表Area的共同列AREA_NO相等的情况下,表Branches_Test表的列AREA_NAME被更新为表Area的列AREA_NAME的值:

SQL> select * from Branches_Test;



BRANCH_NO BRANCH_NAME ADDRESS AREA_NO COUNTRY_NO AREA_NAME DHQ

----------------- ---------------------------------------------------------------- ---------------------------------------------------------------- ----------------- ----------------- ---------------------------------------------------------------- ----------------------------------------------------------------

0001 深圳 03 CN 华南

0101 上海 上海市静安区 01 CN 华东

0102 南京 City of Nanjing 01 CN 华东

0103 福州 01 CN 华东

0104 厦门 Xiamen 01 CN 华东

0401 北京 04 CN 华北

0402 天津 04 CN 华北

0403 大连 大连市 04 CN 华北

0404 沈阳 04 CN 华北

0201 成都 02 CN 华西

0501 武汉 05 CN 华中

0502 长沙 05 CN 华中



12 rows fetched.

2、根据B表的1个共同列的来更新A表的2个列

MySQL多表更新语句:

update Branches_Test a, Area b set a.DHQ = b.DHQ, a.AREA_NAME = b.AREA_NAME where b.AREA_NO = a.AREA_NO;

YashanDB改写语句:

update Branches_Test a

set (a.DHQ, a.AREA_NAME) = (select b.DHQ, b.AREA_NAME

                from Area b

                where b.AREA_NO = a.AREA_NO)

where exists (select * from Area b where b.AREA_NO = a.AREA_NO);

说明:根据表Branches_Test表和表Area的共同列AREA_NO相等的情况下,表Branches_Test的列DHQ和列AREA_NAME被更新为表Area的列DHQ和列AREA_NAME的值:

SQL> select * from Branches_Test;



BRANCH_NO BRANCH_NAME ADDRESS AREA_NO COUNTRY_NO AREA_NAME DHQ

----------------- ---------------------------------------------------------------- ---------------------------------------------------------------- ----------------- ----------------- ---------------------------------------------------------------- ----------------------------------------------------------------

0001 深圳 03 CN 华南 Guangzhou

0101 上海 上海市静安区 01 CN 华东 Shanghai

0102 南京 City of Nanjing 01 CN 华东 Shanghai

0103 福州 01 CN 华东 Shanghai

0104 厦门 Xiamen 01 CN 华东 Shanghai

0401 北京 04 CN 华北 Beijing

0402 天津 04 CN 华北 Beijing

0403 大连 大连市 04 CN 华北 Beijing

0404 沈阳 04 CN 华北 Beijing

0201 成都 02 CN 华西 Chengdu

0501 武汉 05 CN 华中 Wuhan

0502 长沙 05 CN 华中 Wuhan



12 rows fetched.

3、根据B表的1个共同列和其他列的过滤条件来更新A表的1个列

MySQL多表更新语句:

update Branches_Test a, Area b set a.AREA_NAME = b.AREA_NAME where b.AREA_NO = a.AREA_NO and b.DHQ = 'Chengdu';

YashanDB改写语句:

update Branches_Test a

set a.AREA_NAME = (select b.AREA_NAME from Area b where b.AREA_NO = a.AREA_NO)

where exists

(

    select * from Area b

    where b.AREA_NO = a.AREA_NO

        and b.DHQ = 'Chengdu'

);

说明:根据表Branches_Test表和表Area的共同列AREA_NO相等且表Area的列DHQ的值是Chengdu的情况下,表Branches_Test的列AREA_NAME才会被更新为表Area的列AREA_NAME的值,也就是只会更新表Branches_Test的BRANCH_NO=0201的这一行。

SQL> select * from Branches_Test;



BRANCH_NO BRANCH_NAME ADDRESS AREA_NO COUNTRY_NO AREA_NAME DHQ

----------------- ---------------------------------------------------------------- ---------------------------------------------------------------- ----------------- ----------------- ---------------------------------------------------------------- ----------------------------------------------------------------

0001 深圳 03 CN

0101 上海 上海市静安区 01 CN

0102 南京 City of Nanjing 01 CN

0103 福州 01 CN

0104 厦门 Xiamen 01 CN

0401 北京 04 CN

0402 天津 04 CN

0403 大连 大连市 04 CN

0404 沈阳 04 CN

0201 成都 02 CN 华西

0501 武汉 05 CN

0502 长沙 05 CN



12 rows fetched.

注意:下面的YashanDB改写语句与上面的YashanDB改写语句不等价,这种写法会更新表Branches_Test的所有行。

update Branches_Test a

set a.AREA_NAME = (select b.AREA_NAME

                 from Area b

                 where b.AREA_NO = a.AREA_NO

                   and b.DHQ= 'Chengdu');

4、根据B表的2个共同列的来更新A表的2个列

MySQL多表更新语句:

update Branches_Test a, Area b set a.DHQ = b.DHQ, a.AREA_NAME = b.AREA_NAME where b.AREA_NO = a.AREA_NO and b.COUNTRY_NO = a.COUNTRY_NO;

YashanDB改写语句:

update Branches_Test a

set (a.DHQ, a.AREA_NAME) = (select b.DHQ, b.AREA_NAME

                                  from Area b

                                  where b.AREA_NO = a.AREA_NO

                                    and b.COUNTRY_NO = a.COUNTRY_NO);

说明:根据表Branches_Test表和表Area的共同列AREA_NO和COUNTRY_NO相等的情况下,表Branches_Test的列DHQ和列AREA_NAME被更新为表Area的列DHQ和列AREA_NAME的值:

SQL> select * from Branches_Test;



BRANCH_NO BRANCH_NAME ADDRESS AREA_NO COUNTRY_NO AREA_NAME DHQ

----------------- ---------------------------------------------------------------- ---------------------------------------------------------------- ----------------- ----------------- ---------------------------------------------------------------- ----------------------------------------------------------------

0001 深圳 03 CN 华南 Guangzhou

0101 上海 上海市静安区 01 CN 华东 Shanghai

0102 南京 City of Nanjing 01 CN 华东 Shanghai

0103 福州 01 CN 华东 Shanghai

0104 厦门 Xiamen 01 CN 华东 Shanghai

0401 北京 04 CN 华北 Beijing

0402 天津 04 CN 华北 Beijing

0403 大连 大连市 04 CN 华北 Beijing

0404 沈阳 04 CN 华北 Beijing

0201 成都 02 CN 华西 Chengdu

0501 武汉 05 CN 华中 Wuhan

0502 长沙 05 CN 华中 Wuhan



12 rows fetched.
```<details>
<summary>点击查看代码</summary>

点击查看代码

``` </details>
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
SQL 测试技术 数据库
【YashanDB知识库】IMP跨网络导入慢问题
问题现象:290M数据,本地导入2分钟,跨机导入耗时显著增加(最高30分钟)。 原因分析:`imp`逐条SQL通过网络传输至yashanDB执行,交互频繁导致性能下降。 影响版本:客户测试环境22.2.8.3。 解决方法:将导入文件上传至与yashanDB同机后使用`imp`,减少网络延迟。 经验总结:优化`imp`工具,支持直接上传文件至服务器端执行,降低网络依赖。
|
8天前
|
监控 数据库
【YashanDB 知识库】ycm 托管数据库时报错 OM host ip:127.0.0.1 is not support join to YCM
在托管数据库时,若 OM 的 IP 被设置为 127.0.0.1,将导致无法托管至 YCM,并使数据库失去监控。此问题源于安装时修改了 OM 的监听 IP。解决方法包括:将 OM 的 IP 修改为本机实际 IP 或 0.0.0.0,同时更新 env 文件及 yasom 后台数据库中的相关配置。经验总结指出,应避免非必要的后台 IP 修改,且数据库安装需遵循规范,不使用仅限本机访问的 IP(如 127.0.0.1)。
|
8天前
|
监控 网络安全 数据库
YashanDB 知识库:ycm 纳管主机安装 YCM-AGENT 时报错 “任务提交失败,无法连接主机”
在安装 ycm-agent 纳管主机时,可能出现因端口未开放导致的报错问题。此问题会阻止 YCM 对主机和数据库的监控功能,影响版本为 `yashandb-cloud-manager-23.2.1.100-linux-aarch64.tar`。原因是目标主机(如 10.149.223.121)未开放 9070 或 9071 端口。解决方法包括关闭防火墙、添加白名单或开放指定端口,需与管理员确认操作。处理过程涉及网络检查、端口测试等步骤。端口问题解决后,若再次安装报唯一键错误,需先移除失败主机再重试。
|
8天前
|
监控 Java Shell
【YashanDB 知识库】ycm 托管数据库时,数据库非 OM 安装无法托管
本文主要介绍了因数据库未按规范使用 yasboot 安装导致的问题及解决方法。问题表现为无 yasom 和 yasagent 进程,且目录结构缺失,致使 ycm 无法托管与监控。分析发现可能是数据库版本旧或安装不规范引起。解决方法为先生成配置文件,安装 yasom 和 yasagent,再生成并修改托管配置模板,最终通过命令完成托管至 yasom 和 ycm。总结强调了按规范安装数据库的重要性以避免类似问题。
|
25天前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】MySQL field 函数的改写方法
【YashanDB知识库】MySQL field 函数的改写方法
|
25天前
|
数据库
【YashanDB知识库】服务器重启后启动yasom和yasagent进程时有告警
【YashanDB知识库】服务器重启后启动yasom和yasagent进程时有告警
|
25天前
|
SQL 存储 关系型数据库
【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
|
25天前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
25天前
|
SQL 关系型数据库 PostgreSQL
【YashanDB 知识库】从 PostgreSQL 迁移到 YashanDB 如何进行数据行数比对
【YashanDB 知识库】从 PostgreSQL 迁移到 YashanDB 如何进行数据行数比对
|
25天前
|
SQL 关系型数据库 MySQL
【YashanDB 知识库】YashanDB 支持 MySQL 多表更新语句的解决方法
【YashanDB 知识库】YashanDB 支持 MySQL 多表更新语句的解决方法

推荐镜像

更多