OceanBase学习之路12|体验 DDL 新特性(MySQL 模式)

OceanBase 数据库 MySQL 模式下的 DDL 新特性包括变更主键、变更分区类型、变更列类型和修改字符集。

变更主键

OceanBase 数据库 MySQL 模式下的变更主键操作包括添加主键、修改主键和删除主键。

添加主键

添加主键的语法如下:

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

添加主键的示例如下:

obclient> CREATE TABLE tbl1(c1 INT,c2 VARCHAR(50));
Query OK, 0 rows affected
obclient> ALTER TABLE tbl1 ADD PRIMARY KEY(c1);
Query OK, 0 rows affected

修改主键

修改主键的语法如下:

ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (column_name_list);

修改主键的示例如下:

obclient> ALTER TABLE tbl1 DROP PRIMARY KEY,ADD PRIMARY KEY(c2);
Query OK, 0 rows affected

删除主键

删除主键的语法如下:

ALTER TABLE table_name DROP PRIMARY KEY;

删除主键的示例如下:

obclient> ALTER TABLE tbl1 DROP PRIMARY KEY;
Query OK, 0 rows affected

变更分区类型

OceanBase 数据库 MySQL 模式下变更分区类型的语法如下:

ALTER TABLE table_name PARTITION BY (partition_definitions);

变更分区示例

示例 1:将 Hash 分区更改为 Key 分区方式。

obclient> CREATE TABLE tbl2(c1 INT, c2 DATETIME, PRIMARY KEY(c1, c2)) 
PARTITION BY HASH(c1) PARTITIONS 4;
Query OK, 0 rows affected
obclient> ALTER TABLE tbl2 PARTITION BY KEY(c1) PARTITIONS 10;
Query OK, 0 rows affected

示例 2:将一级 Hash 分区表修改为模板化 Hash+Range 二级分区表。

obclient> ALTER TABLE tbl2 
       PARTITION BY HASH(c1)
                SUBPARTITION BY RANGE COLUMNS(c2)
                SUBPARTITION TEMPLATE(
                SUBPARTITION p1 VALUES LESS THAN ('2016-10-10'),
                SUBPARTITION p2 VALUES LESS THAN ('2116-3-30')) PARTITIONS 2;
Query OK, 0 rows affected

示例 3:将 Hash + Range 二级分区表转为 Range Columns+Range Columns 分区。

obclient> ALTER TABLE tbl2
   PARTITION BY RANGE COLUMNS(c1)
    SUBPARTITION BY RANGE COLUMNS(c2)
  (
  PARTITION p0 VALUES LESS THAN (100)
  (SUBPARTITION sp0 VALUES LESS THAN ('2020-01-01')
  ,SUBPARTITION sp1 VALUES LESS THAN  ('2021-01-01')
  ,SUBPARTITION sp2 VALUES LESS THAN ('2022-01-01')
  ,SUBPARTITION sp3 VALUES LESS THAN  ('2023-01-01')
  ),
  PARTITION p1 VALUES LESS THAN (200)
  (SUBPARTITION sp4 VALUES LESS THAN ('2020-01-01')
  ,SUBPARTITION sp5 VALUES LESS THAN  ('2021-01-01')
  ,SUBPARTITION sp6 VALUES LESS THAN ('2022-01-01')
  ,SUBPARTITION sp7 VALUES LESS THAN  ('2023-01-01'))
  );
Query OK, 0 rows affected

变更列类型

OceanBase 数据库 MySQL 模式下所支持的列类型的相关转换如下:

  • 字符类型列的数据类型转换,包括  CHARVARCHARTINYTEXTTEXT 和  LONGTEXT
  • 数值类型列的数据类型转换,包括  TINYINTSMALLINTMEDIUMINTINT 和  BIGINT
  • 二进制类型的数据类型转换,包括  BINARYVARBINARYBLOBTINYBLOBMEDIUMBLOB 和  LONGBLOB
  • 带精度的数据类型支持改变精度,包括  VARCHARFLOATDOUBLE 和  DECIMAL
  • 带精度的数据类型之间的转换,包括  FLOATDOUBLE 和  DECIMAL
  • 不同数据类型之间的转换,包括  INTVARCHARDOUBLEFLOAT 和  DECIMAL

修改列类型的语法如下:

ALTER TABLE table_name MODEFY column_name data_type;

修改列类型的示例

字符数据类型之间的转换示例

如下示例为修改字符数据类型列的数据类型并提升长度。

obclient> CREATE TABLE test01 (c1 INT PRIMARY KEY, c2 CHAR(10), c3 CHAR(10));
Query OK, 0 rows affected
obclient> ALTER TABLE test01 MODIFY C2 VARCHAR(20);
Query OK, 0 rows affected
obclient> ALTER TABLE test01 MODIFY C2 VARCHAR(40);
Query OK, 0 rows affected
obclient> ALTER TABLE test01 MODIFY C2 TINYTEXT;
Query OK, 0 rows affected
obclient> ALTER TABLE test01 MODIFY C2 LONGTEXT;
Query OK, 0 rows affected
obclient> ALTER TABLE test01 MODIFY C3 CHAR(20);
Query OK, 0 rows affected
obclient> ALTER TABLE test01 MODIFY C3 VARCHAR(30);
Query OK, 0 rows affected

数值数据类型之间的转换示例

示例 1:修改整数类型列的数据类型并提升长度。

obclient> CREATE TABLE test02 (id INT PRIMARY KEY, name VARCHAR(10),age TINYINT, description VARCHAR(65525));
Query OK, 0 rows affected
obclient> ALTER TABLE test02 MODIFY age SMALLINT;
Query OK, 0 rows affected
obclient> ALTER TABLE test02 MODIFY age INT;
Query OK, 0 rows affected
obclient> ALTER TABLE test02 MODIFY age BIGGINT;
Query OK, 0 rows affected

示例 2:修改带精度的数据类型列的数据类型和长度。

obclient> CREATE TABLE test03(c1 INT, c2 FLOAT(8,2), c3 FLOAT(8,2), UNIQUE(c2, c3));
Query OK, 0 rows affected
obclient> ALTER TABLE test03 MODIFY c2 FLOAT(5,2);
Query OK, 0 rows affected
obclient> ALTER TABLE test03 MODIFY c2 DOUBLE(10,4);
Query OK, 0 rows affected
obclient> ALTER TABLE test03 MODIFY c2 DOUBLE(5,2);
Query OK, 0 rows affected
obclient> ALTER TABLE test03 MODIFY c2 DECIMAL(20, 4);
Query OK, 0 rows affected

二进制类型数据类型的转换示例

obclient> CREATE TABLE test04 (c1 TINYBLOB, c2 BINARY(64));
Query OK, 0 rows affected
obclient> ALTER TABLE test04 MODIFY c1 BLOB;
Query OK, 0 rows affected
obclient> ALTER TABLE test04 MODIFY c1 BINARY(256);
Query OK, 0 rows affected
obclient> CREATE TABLE test05 (id INT PRIMARY KEY, name TINYTEXT,age INT, description VARCHAR(65535));
Query OK, 0 rows affected
obclient> ALTER TABLE test05 MODIFY name VARCHAR(256);
Query OK, 0 rows affected

整数型数据与字符型数据的转换示例

obclient> CREATE TABLE test06 (c1 INT);
Query OK, 0 rows affected
obclient> ALTER TABLE test06 MODIFY c1 VARCHAR(64);
Query OK, 0 rows affected
obclient> CREATE TABLE test07 (c1 VARCHAR(32));
Query OK, 0 rows affected
obclient> ALTER TABLE test07 MODIFY c1 INT;
Query OK, 0 rows affected

修改表或者列的字符集和字符序(COLLATION)

修改表的字符集和字符序

OceanBase 数据库 MySQL 模式下修改表的字符序和字符集的语法如下:

ALTER TABLE table_name CHARACTER SET = charset_name COLLATE =collate_name;

说明

此语法只修改表所在的 Schema 上的字符序和字符集,只对之后新增加的表起作用。

示例如下:

obclient> CREATE TABLE test_collation (c1 INT PRIMARY KEY, c2 VARCHAR(32), c3 VARCHAR(32), UNIQUE KEY idx_test_collation_c2(c2));
Query OK, 0 rows affected
obclient> ALTER TABLE test_collation CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;
Query OK, 0 rows affected

修改表中已有数据的字符集和字符序

OceanBase 数据库 MySQL 模式下修改表中已有数据的字符集和字符序的语法如下:

ALTER TABLE table_name CONVERT TO CHARACTER SET charset_name COLLATE collate_name;

说明

此语法不仅修改了表上已有数据的字符集和字符序,也会修改表所在的 Schema 上的字符序和字符集。

示例如下:

obclient> ALTER TABLE test_collation CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
Query OK, 0 rows affected

修改列的字符集和字符序

OceanBase 数据库 MySQL 模式下修改列的字符序和字符集的语法如下:

ALTER TABLE table_name MODIFY COLUMN column_name data_type COLLATE collate_name;

示例如下:

obclient> ALTER TABLE test_collation MODIFY COLUMN c2 VARCHAR(32) COLLATE utf8mb4_bin;
Query OK, 0 rows affected


请使用浏览器的分享功能分享到微信等