本文内容来自 YashanDB 官网,原文内容请见 https://www.yashandb.com/newsinfo/7664895.html?templateId=171...
前言
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 supportedSQL> 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 华东 Shanghai02 CN 华西 Chengdu03 CN 华南 Guangzhou04 CN 华北 Beijing05 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 CN0101 上海 上海市静安区 01 CN0102 南京 City of Nanjing 01 CN0103 福州 01 CN0104 厦门 Xiamen 01 CN0401 北京 04 CN0402 天津 04 CN0403 大连 大连市 04 CN0404 沈阳 04 CN0201 成都 02 CN0501 武汉 05 CN0502 长沙 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 aset (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 华南 Guangzhou0101 上海 上海市静安区 01 CN 华东 Shanghai0102 南京 City of Nanjing 01 CN 华东 Shanghai0103 福州 01 CN 华东 Shanghai0104 厦门 Xiamen 01 CN 华东 Shanghai0401 北京 04 CN 华北 Beijing0402 天津 04 CN 华北 Beijing0403 大连 大连市 04 CN 华北 Beijing0404 沈阳 04 CN 华北 Beijing0201 成都 02 CN 华西 Chengdu0501 武汉 05 CN 华中 Wuhan0502 长沙 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 aset 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 CN0101 上海 上海市静安区 01 CN0102 南京 City of Nanjing 01 CN0103 福州 01 CN0104 厦门 Xiamen 01 CN0401 北京 04 CN0402 天津 04 CN0403 大连 大连市 04 CN0404 沈阳 04 CN0201 成都 02 CN 华西0501 武汉 05 CN0502 长沙 05 CN 12 rows fetched.
注意:下面的 YashanDB 改写语句与上面的 YashanDB 改写语句不等价,这种写法会更新表 Branches_Test 的所有行。
update Branches_Test aset 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 aset (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 华南 Guangzhou0101 上海 上海市静安区 01 CN 华东 Shanghai0102 南京 City of Nanjing 01 CN 华东 Shanghai0103 福州 01 CN 华东 Shanghai0104 厦门 Xiamen 01 CN 华东 Shanghai0401 北京 04 CN 华北 Beijing0402 天津 04 CN 华北 Beijing0403 大连 大连市 04 CN 华北 Beijing0404 沈阳 04 CN 华北 Beijing0201 成都 02 CN 华西 Chengdu0501 武汉 05 CN 华中 Wuhan0502 长沙 05 CN 华中 Wuhan 12 rows fetched.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70028812/viewspace-3071833/ ,如需转载,请注明出处,否则将追究法律责任。