表创建成功后,您可以使用 ALTER TABLE 语句对表进行修改。
更改表的 Collation 和字符集
创建表时,如果未明确定义表的 Collation 和字符集,则默认使用数据库的字符集和字符序,数据库的 Collation 和字符集的详细介绍信息请参见 数据库级字符集和字符序。
表创建后,您可以修改表的 Collation 和字符集设置。 语句如下:
ALTER TABLE table_name [[DEFAULT] CHARACTER SET [=] charset_name] [COLLATE [=] collation_name];
OceanBase 数据库中表的 Collation 和字符集的详细介绍信息请参见 表级字符集和字符序。
注意
修改表的 Collation 和字符集设置仅影响后续添加的字符类型的列的数据保存方式,已有字符类型的列的数据保存方式不会被修改。
示例如下:
创建表
tbl1。obclient> CREATE TABLE tbl1 (c1 int, c2 varchar(32), c3 varchar(32), PRIMARY KEY(c1), UNIQUE KEY uk1(c2));修改表的 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 数据库支持一次增加多个索引,索引关键字用
INDEX或KEY均可以。示例如下:
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 affectedmyidx(c1,c2)同时给c1、c2列添加索引,myidx为索引名。删除索引
OceanBase 数据库支持删除索引,删除多个索引时用逗号隔开,索引关键字用
INDEX或KEY均可以。示例如下:
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。




