OceanBase V4.2 特性解析:MySQL兼容之rename column 语法支持

1. 背景描述

MySQL 自8.0版本起,已支持rename column语法,这一语法允许用户在不更改列定义的情况下,为列重新命名。下面为使用rename column语法的一个具体示例:

alter table t1 rename column col_a to col_b;

在OceanBase过去的版本中,Oracle租户已经支持了rename column语法。而在最新的4.2.1版本及以后,我们进一步扩展了对MySQL租户的支持,引入了rename column语法,从而实现对MySQL 8.0的更多兼容。

2. 功能描述

rename column语法:

ALTER TABLE tbl_name [rename_action [, rename_action] ...];rename_action: RENAME old_col_name To new_col_name;

rename column不改变列定义,仅修改列名。如果目标名称在表中已经存在,那么rename column执行会报错:

OceanBase(root@test)>create table t1 (a int, b int);
Query OK, 0 rows affected (0.100 sec)OceanBase(root@test)>alter table t1 rename column a to b;
ERROR 1060 (42S21): Duplicate column name 'b'

不过也有例外,如果重命名的列出现了循环,可以正常执行。比如下面的是一个合法的alter示例:

OceanBase(root@test)>create table t1 (a int, b int);
Query OK, 0 rows affected (0.046 sec)OceanBase(root@test)>alter table t1 rename column a to b, rename column b to a;
Query OK, 0 rows affected (0.076 sec)OceanBase(root@test)>desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| b     | int(11) | YES  |     | NULL    |       |
| a     | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.003 sec)

如果重命名的列上建有索引,或者有外键约束,rename column可以正常执行,并且索引定义和外键约束会自动级联联修改,比如:

OceanBase(root@test)>create table t1 (a int, b int, index idx_a(a));
Query OK, 0 rows affected (0.057 sec)OceanBase(root@test)>show index from t1;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment   | Index_comment | Visible | Expression |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
| t1    |          1 | idx_a    |            1 | a           | A         |        NULL | NULL     | NULL   | YES  | BTREE      | available |               | YES     | NULL       |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
1 row in set (0.014 sec)OceanBase(root@test)>alter table t1 rename column a to c;
Query OK, 0 rows affected (0.058 sec)OceanBase(root@test)>show index from t1;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment   | Index_comment | Visible | Expression |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
| t1    |          1 | idx_a    |            1 | c           | A         |        NULL | NULL     | NULL   | YES  | BTREE      | available |               | YES     | NULL       |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+
OceanBase(root@test)>create table t1 (a int primary key);
Query OK, 0 rows affected (0.043 sec)OceanBase(root@test)>create table t2(b int, foreign key (b) references t1(a));
Query OK, 0 rows affected (0.066 sec)OceanBase(root@test)>show create table t2;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                             |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t2    | CREATE TABLE `t2` (`b` int(11) DEFAULT NULL,CONSTRAINT `t2_OBFK_1691379783330957` FOREIGN KEY (`b`) REFERENCES `test`.`t1`(`a`) ON UPDATE RESTRICT ON DELETE RESTRICT
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.019 sec)OceanBase(root@test)>alter table t1 rename column a to b;
Query OK, 0 rows affected (0.053 sec)OceanBase(root@test)>show create table t2;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                             |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t2    | CREATE TABLE `t2` (`b` int(11) DEFAULT NULL,CONSTRAINT `t2_OBFK_1691379783330957` FOREIGN KEY (`b`) REFERENCES `test`.`t1`(`b`) ON UPDATE RESTRICT ON DELETE RESTRICT
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.009 sec)

但是在以下场景,并不会自动级联修改:

  1. 重命名的列被生成列表达式引用,执行会报错,不支持修改。
  2. 重命名的列被分区表达式引用,执行报错,不支持修改。
  3. 重命名的列被check约束引用,执行报错,不支持修改。
  4. 重命名的列被视图引用,rename column执行成功,查询视图报错,需要用户手动修改视图定义。
  5. 重命名的列被存储过程引用,rename column执行成功,call procedure报错,需要用户手动修改。
OceanBase(root@test)>create table t1(a int, b int as (a + 1), c int, d int, constraint d_check check(d > 0)) partition by hash(c + 1) partitions 2;
Query OK, 0 rows affected (0.057 sec)OceanBase(root@test)>alter table t1 rename column a to e;
ERROR 3108 (HY000): Column 'a' has a generated column dependency
OceanBase(root@test)>alter table t1 rename column c to e;
ERROR 3855 (HY000): Column 'c' has a partitioning function dependency and cannot be dropped or renamed.
OceanBase(root@test)>alter table t1 rename column d to e;
ERROR 3959 (HY000): Check constraint 'd_check' uses column 'd', hence column cannot be dropped or renamed.
OceanBase(root@test)>create table t1 (a int);
Query OK, 0 rows affected (0.043 sec)OceanBase(root@test)>create view v1 as select a + 1 from t1;
Query OK, 0 rows affected (0.040 sec)OceanBase(root@test)>create procedure p() select a + 1 from t1;
Query OK, 0 rows affected (0.036 sec)OceanBase(root@test)>select * from v1;
Empty set (0.010 sec)OceanBase(root@test)>call p();
Empty set (0.014 sec)Query OK, 0 rows affected (0.014 sec)OceanBase(root@test)>alter table t1 rename column a to b;
Query OK, 0 rows affected (0.053 sec)OceanBase(root@test)>select * from v1;
ERROR 1356 (42S22): View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
OceanBase(root@test)>call p();
ERROR 1054 (42S22): Unknown column 'a' in 'field list'

3. 限制以及注意事项

第一:MySQL 8.0规定ADD PARTITIONDROP PARTITIONDISCARD PARTITIONIMPORT PARTITIONCOALESCE PARTITIONREORGANIZE PARTITIONEXCHANGE PARTITIONANALYZE PARTITIONCHECK PARTITIONREPAIR PARTITION 操作不能和rename column语句一起使用,比如下面一个add partition的例子,执行会报语法错误:

mysql> create table t1 (a int, b int) partition by range(a) (partition p0 values less than (10));
Query OK, 0 rows affected (0.01 sec)mysql> alter table t1 rename column b to c, add partition (partition p1 values less than (20));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'partition (partition p1 values less than (20))' at line 1

对于同一条alter stmt中同时包含alter_partition_action和alter_column_action的场景,OB当前的实现选择了执行报错(NOT SUPPORTED错误),比如上述SQL:

OceanBase(root@test)>create table t1 (a int, b int) partition by range(a) (partition p0 values less than (10));
Query OK, 0 rows affected (0.052 sec)OceanBase(root@test)>alter table t1 rename column b to c, add partition (partition p1 values less than (20));
ERROR 1235 (0A000): specify alter_column_action and alter_partition_action in a single alter table stmt not supported

第二:MySQL 8.0支持在同一条alter stmt中指定drop column和rename column,如果rename的目标列名和drop的列名相同,rename column可以执行成功,比如:

mysql> create table t1(a int, b int);
Query OK, 0 rows affected (0.01 sec)mysql> alter table t1 drop column a, rename column b to a;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

OB目前不支持上述两个alter_column_action在一次DDL中执行:

OceanBase(root@test)>create table t1 (a int, b int);
Query OK, 0 rows affected (0.047 sec)OceanBase(root@test)>alter table t1 drop column a, rename column b to a;
ERROR 1060 (42S21): Duplicate column name 'a'

建议再drop column和rename column拆成两个DDL语句执行分别执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/14702.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何秒杀Promise面试题

如何秒杀Promise面试题 如果你在面试的时候技术面给你出了点关于Promise的面试题首先不要慌,先问候他爹妈一套问候语! 然后切记不要(ps:这是病句别在意!🤣) 自己想 找他要纸和笔 首先关于promise的面试题无非就是 promise 的状态和宏队列、…

git pull 出错 fatal: bad object refs/remotes/origin/xxxxx

使用git pull时出现以下问题 fatal: bad object refs/remotes/origin/xxxxx error: https://github.com/xxxxxx.git did not send all necessary objects解决办法 删除项目目录 .git\refs\remotes\origin 下面的所有文件 在 git pull 参考链接 How to handle git gc fatal: b…

5.23.9 TransUNet:Transformers 为医学图像分割提供强大的编码器

TransUNet,它兼具 Transformers 和 U-Net 的优点,作为医学图像分割的强大替代方案。一方面,Transformer 对来自卷积神经网络 (CNN) 特征图的标记化图像块进行编码,作为用于提取全局上下文的输入序列。另一方面,解码器对…

css去除复选框默认样式

HTML: <input type"checkbox" id"myCheckbox" class"custom-checkbox" /> <label for"myCheckbox" class"checkbox-label">自定义复选框</label> CSS: /* 隐藏默认复选框 */.custom-checkbox { -webk…

Go知识点复习

Go知识点复习 1.关于包的使用和GOPATH的配置 src:用于以代码包的形式组织并保存Go源码文件, 需要手动创建pkg目录&#xff1a;用于存放经由go install命令构建安装后的代码包&#xff08;包含Go库源码文件&#xff09;的“.a”归档文件bin目录&#xff1a;与pkg目录类似&…

C++学习-hello word

#include "iostream" #预处理指令 using namespace std; #预处理指令 int main() #程序执行从这里开始 {cout << "Hello, World!" << endl; #逻辑代码&#xff08;具体的功能代码&#xff09;return 0; …

国家开放大学,javaScript程序设计-形考任务-实训五:设计登录和注册页|实训六:设计简单的购物车

实训五&#xff1a;设计登录和注册页 1. 题目 设计登录和注册页。 2. 目的 &#xff08;1&#xff09;掌握表单域的引用方法。 &#xff08;2&#xff09;掌握常用控件的基本方法。 &#xff08;3&#xff09;掌握事件的处理方法。 &#xff08;4&#xff09;理解Cookie…

tomcat三级指导

版本 ./catalina.sh linux version.bat win 1.确认是否使用了tomcat管理后台 我们先找到配置文件&#xff1a;tomcat主目录下/conf/server.xml 可以查看到连接端口&#xff0c;默认为8080 然后查看manager-gui管理页面配置文件&#xff0c;是否设置了用户登录 配置文件…

如何创建 Gala Games 账户:解决 Cloudflare 验证指南 2024

Gala Games 站在数字娱乐新时代的前沿&#xff0c;将区块链技术与游戏相结合&#xff0c;重新定义了所有权和奖励。本文将引导您创建 Gala Games 账户并使用 CapSolver 解决 Cloudflare 验证难题&#xff0c;确保您顺利进入这一创新的生态系统。 什么是 Gala Games&#xff1f…

CRMEB开源商城标准版系统前端技术架构与实践探索

摘要&#xff1a; 随着电子商务的蓬勃发展&#xff0c;开源商城系统因其灵活性、可扩展性和成本效益受到了广泛关注。本文以CRMEB开源商城系统为例&#xff0c;探讨了其前端技术架构、开发实践及未来展望。通过对CRMEB系统前端技术的深入分析&#xff0c;旨在为开发者提供有价值…

JS的for循环中的var 和 let

在js的嵌套for循环异步执行&#xff0c;声明 i 和 使用 i 获取到的变量 都要用 let 声明&#xff0c;不要用var。 除非封装一个函数&#xff0c;把参数传进去调用&#xff0c;才能避免var使用最后一个变量&#xff0c;没必要。 同步 vs 异步: Java.perform 本身是同步执行的。…

筛斗数据:文档识别技术在教育行业的影响

随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经在各个领域产生了深远的影响。其中&#xff0c;文档识别技术作为人工智能的一个重要分支&#xff0c;在教育行业中也发挥着越来越重要的作用。本文将探讨文档识别技术在教育行业中的应用及其带来的影…

Android的init.rc文件重启会回到原始状态

Android系统中的init.rc文件是一个初始化语言脚本&#xff0c;它在系统启动时由init进程读取并执行&#xff0c;用于启动服务和管理设备。如果您在Android设备上直接编辑了init.rc文件&#xff0c;然后重启设备&#xff0c;发现修改未保存&#xff0c;这是由于Android系统的启动…

vmware - 主机向虚拟机拷贝文件的临时方法

文章目录 vmware - 主机向虚拟机拷贝文件的临时方法概述笔记确认主机/虚拟机之间网络是通的在虚拟机中新建一个文件夹(e.g. c:\test), 将这个文件夹设为共享文件夹。查看虚拟机中的当前用户(远程登录要用)远程登录备注 - win8.1只能用mstscEND vmware - 主机向虚拟机拷贝文件的…

04_闭包 (JS高级)

目录 一、闭包是什么 二、常见的闭包 三、闭包的作用 四、闭包的生命周期 五、闭包的应用 5.1、定义JS模块方式一 5.2、定义JS模块方式二 六、闭包的缺点及解决 七、经典习题 一、闭包是什么 闭包&#xff08;closure&#xff09;是一个嵌套的内部函数以及它所引用环境的…

网络模型-单臂路由配置相关命令

一、单臂路由配置相关命令 执行命令system-view&#xff0c;进入系统视图. 执行命令interface interface-type interface-number&#xff0c;进入接口视图, 执行命令port link-type {hybrid |trunk}&#xff0c;配置端口类型。 执行命令quit&#xff0c;退出接口视图。 执…

游戏行业 2024 Q1报告 | 国内同比上升7.6%,海外收入同比环比双增长,码住!

作为中国音像与数字出版协会主管的中国游戏产业研究院的战略合作伙伴&#xff0c;伽马数据发布了《2024年1—3月中国游戏产业季度报告》。 数据显示&#xff0c; 2024年1—3月&#xff0c;中国游戏市场实际销售收入726.38亿元&#xff0c;同比增长7.60%&#xff0c;主要受移动游…

Python面试宝典:Python中与异步编程和协程相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第十三章:并发编程:第三节:异步编程和协程】 第十三章:并发编程第三节:异步编程和协程异步编程和协程相关的知识异步编程基础异步函数(async function)等待协程(awaiting a corou…

信息系统项目管理师--八大绩效域-项目工作绩效域

信息系统项目管理师的八大绩效域包括&#xff1a;干系人、团队、开发方法和生命周期、规划、项目工作、交付、不确定性、度量。 项目工作绩效域涉及项目工作相关的活动和职能。 预期目标 1、高效且有效的项目绩效 2、适合项目和环境的项目过程 3、干系人适当的沟通和参与 …

【Linux】详解线程控制之线程创建线程终止线程等待线程分离

一、线程创建 thread&#xff1a;这是一个指向pthread_t类型的指针&#xff0c;用于获取新创建线程的线程ID。在调用pthread_create后&#xff0c;这个指针会被设置为新线程的ID。 attr&#xff1a;这是一个指向pthread_attr_t类型的指针&#xff0c;用于设置线程的属性&#x…