暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase 学习笔记113:如何使用 SQL 语句对表进行修改?

1725

表创建成功后,您可以使用 ALTER TABLE 语句对表进行修改。

更改表的 Collation 和字符集

创建表时,如果未明确定义表的 Collation 和字符集,则默认使用数据库的字符集和字符序,数据库的 Collation 和字符集的详细介绍信息请参见 数据库级字符集和字符序

表创建后,您可以修改表的 Collation 和字符集设置。 语句如下:

ALTER TABLE table_name [[DEFAULT] CHARACTER SET [=] charset_name] [COLLATE [=] collation_name];

OceanBase 数据库中表的 Collation 和字符集的详细介绍信息请参见 表级字符集和字符序

注意

修改表的 Collation 和字符集设置仅影响后续添加的字符类型的列的数据保存方式,已有字符类型的列的数据保存方式不会被修改。

示例如下:

  1. 创建表 tbl1

    obclient> CREATE TABLE tbl1 (c1 int, c2 varchar(32), c3 varchar(32), PRIMARY KEY(c1), UNIQUE KEY uk1(c2));
    
  2. 修改表的 Collation 和字符集。

    obclient> ALTER TABLE tbl1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;
    

    如果表中已有数据,您可以修改表中已有数据的 Collation 和字符集,并将表的 Collation 和字符集也修改为对应的设置。示例如下:

    obclient> ALTER TABLE tbl1 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
    

更改表结构

OceanBase 数据库支持新增列、修改列及其属性、删除列等。

  • 新增列,支持在表中新增列,但不支持直接增加主键列。如果需要增加主键列,建议先增加列后再为列添加主键。添加主键的相关操作请参见 定义列的约束类型

    新增普通列的示例如下:

    obclient> DESCRIBE test;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | c1    | int(11)     | NO   | PRI | NULL    |       |
    | c2    | varchar(50) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set
    
    obclient> ALTER TABLE test ADD c3 int;
    Query OK, 0 rows affected
    
    obclient> DESCRIBE test;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | c1    | int(11)     | NO   | PRI | NULL    |       |
    | c2    | varchar(50) | YES  |     | NULL    |       |
    | c3    | int(11)     | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    3 rows in set
    
  • 新增列,支持在指定位置新增列。在 c1 列后面指定添 c4 列,示例如下:

    obclient> ALTER TABLE test ADD COLUMN c4 INT NULL AFTER c1;
    Query OK, 0 rows affected
    
    obclient> DESC test;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | c1    | int(11)     | NO   | PRI | NULL    |       |
    | c4    | int(11)     | YES  |     | NULL    |       |
    | c2    | varchar(50) | YES  |     | NULL    |       |
    | c3    | int(11)     | NO   |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    5 rows in set
    
  • 新增列,支持在指定位置新增列。在 c1 列前面指定添 c6 列,示例如下:

    obclient> ALTER TABLE test ADD COLUMN c6 INT NULL BEFORE c1;
    Query OK, 0 rows affected
    
    obclient> DESC test;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | c6    | int(11)     | YES  |     | NULL    |       |
    | c1    | int(11)     | NO   | PRI | NULL    |       |
    | c3    | int(11)     | NO   |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    6 rows in set
    

    显示的字段解释如下:

    • Field :字段信息为列名。

    • Type :该列的数据类型。

    • Null :表示该列是否允许为空,NO 表示不允许为空,YES 表示允许为空。

    • key :字段信息显示为 PRI 代表改列为主键列。

  • 修改列属性,支持修改列名称和列类型。

    OceanBase 数据库中 MySQL 模式下列类型的转换规则及详细信息请参见 列类型变更规则。。。

    示例如下:

    obclient> DESCRIBE test;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | c1    | int(11)     | NO   | PRI | NULL    |       |
    | c2    | varchar(50) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set
    
    obclient> ALTER TABLE test CHANGE COLUMN c2 c CHAR(60);
    Query OK, 0 rows affected
    
    obclient> DESCRIBE test;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | c1    | int(11)  | NO   | PRI | NULL    |       |
    | c     | char(60) | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+
    2 rows in set
    

    或者您也可以通过以下方式修改列定义。示例如下:

    obclient> ALTER TABLE test MODIFY c2 varchar(60);
    Query OK, 0 rows affected
    
    obclient> DESCRIBE test;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | c1    | int(11)     | NO   | PRI | NULL    |       |
    | c2    | varchar(60) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set
    
  • 修改列属性,支持修改列的 default 值为 2

    示例如下:

    obclient> DESC test;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | c1    | int(11)     | NO   | PRI | NULL    |       |
    | c2    | varchar(50) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set
    
    obclient> ALTER TABLE test CHANGE COLUMN c2 c2 varchar(50)  DEFAULT 2;
    Query OK, 0 rows affected
    
    obclient> DESC test;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | c1    | int(11)     | NO   | PRI | NULL    |       |
    | c2    | varchar(50) | YES  |     | 2       |       |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set
    

    或者您也可以通过以下方法修改列的默认值。

    语法如下:

    obclient> ALTER [COLUMN] {SET DEFAULT const_value | DROP DEFAULT}
    
  • 修改列的 Collation 和字符集。

    如果添加列时,未在各个列的定义中指定列的字符集和字符序,则各个列将默认使用表的字符集和字符序。您可以根据业务需要,修改各个列的 Collation 和字符集设置。

    示例如下:

    obclient> CREATE TABLE tbl1 (c1 int, c2 varchar(32), c3 varchar(32), PRIMARY KEY(c1), UNIQUE KEY uk1(c2));
    
    obclient> ALTER TABLE tbl1 MODIFY COLUMN c2 varchar(32) COLLATE utf8mb4_bin;
    

    OceanBase 数据库中,列的 Collation 和字符集的详细介绍信息请参见 列级字符集和字符序

  • 删除列,支持删除表中的普通列和含索引的列,但不允许删除主键列。

    示例如下:

    • 删除表中的普通列。

      obclient> DESCRIBE test;
      +-------+----------+------+-----+---------+-------+
      | Field | Type     | Null | Key | Default | Extra |
      +-------+----------+------+-----+---------+-------+
      | c1    | int(11)  | NO   | PRI | NULL    |       |
      | c     | char(60) | YES  |     | NULL    |       |
      +-------+----------+------+-----+---------+-------+
      2 rows in set
      
      obclient> ALTER TABLE test DROP c;
      Query OK, 0 rows affected
      
      obclient> DESCRIBE test;
      +-------+---------+------+-----+---------+-------+
      | Field | Type    | Null | Key | Default | Extra |
      +-------+---------+------+-----+---------+-------+
      | c1    | int(11) | NO   | PRI | NULL    |       |
      +-------+---------+------+-----+---------+-------+
      1 row in set
      
    • 删除表中含索引的列。

      obclient> CREATE TABLE test (c1 int, c2 varchar(32), c3 varchar(32), PRIMARY KEY(c1), INDEX(c2));
      Query OK, 0 rows affected
      
      obclient> DESCRIBE test;
      +-------+-------------+------+-----+---------+-------+
      | Field | Type        | Null | Key | Default | Extra |
      +-------+-------------+------+-----+---------+-------+
      | c1    | int(11)     | NO   | PRI | NULL    |       |
      | c2    | varchar(32) | YES  | MUL | NULL    |       |
      | c3    | varchar(32) | YES  |     | NULL    |       |
      +-------+-------------+------+-----+---------+-------+
      3 rows in set
      
      obclient> ALTER TABLE test DROP c2;
      Query OK, 0 rows affected
      
      obclient> DESCRIBE test;
      +-------+-------------+------+-----+---------+-------+
      | Field | Type        | Null | Key | Default | Extra |
      +-------+-------------+------+-----+---------+-------+
      | c1    | int(11)     | NO   | PRI | NULL    |       |
      | c3    | varchar(32) | YES  |     | NULL    |       |
      +-------+-------------+------+-----+---------+-------+
      2 rows in set
      

修改索引

OceanBase 数据库支持增加唯一索引和普通索引,同时还支持修改索引的属性。

  • 增加唯一索引

    OceanBase 数据库支持在创建表后为表增加唯一索引。如果创建表时同时设置了主键,OceanBase 数据库会默认为主键列创建一个唯一索引。

    增加唯一索引的示例如下:

    obclient> CREATE TABLE test (c1 int PRIMARY KEY, c2 VARCHAR(50));
    Query OK, 0 rows affected
    
    obclient> ALTER TABLE test ADD UNIQUE INDEX index_name(c2);
    Query OK, 0 rows affected
    
  • 增加普通索引

    OceanBase 数据库支持一次增加多个索引,索引关键字用INDEXKEY均可以。

    示例如下:

    obclient> CREATE TABLE test (c1 int PRIMARY KEY, c2 VARCHAR(50));
    Query OK, 0 rows affected
    
    obclient> ALTER TABLE test ADD INDEX myidx(c1,c2);
    Query OK, 0 rows affected
    

    myidx(c1,c2) 同时给 c1c2 列添加索引, myidx 为索引名。

  • 删除索引

    OceanBase 数据库支持删除索引,删除多个索引时用逗号隔开,索引关键字用INDEXKEY均可以。

    示例如下:

    obclient> ALTER TABLE test DROP KEY index_name, DROP KEY index_name1;
    Query OK, 0 rows affected
    

更改表的主键、外键及 Check 约束

OceanBase 数据库支持更改表的主键、外键及 Check 约束,具体操作及详细说明请参见 定义列的约束类型

更改表的副本数

  • 设置表的副本数为 2

    示例如下:

    obclient> ALTER TABLE test SET REPLICA_NUM=2;
    Query OK, 0 rows affected
    

重命名表

表创建成功后,您可以更改表名。OceanBase 数据库支持重命名表。

示例如下:

obclient> ALTER TABLE test RENAME TO t1;

或者也可以使用以下语句:

obclient> RENAME TABLE test TO t1;

更多 ALTER TABLE 语句的介绍,请参见 ALTER TABLE

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论