表创建成功后,您可以使用ALTER TABLE
语句对表进行修改。
增加、修改和删除列
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 (0.01 sec)
obclient> ALTER TABLE test ADD c3 int;
Query OK, 0 rows affected (0.03 sec)
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 (0.00 sec)
Oracle 模式下的新增列示例
obclient> DESCRIBE test;
+-------+--------------+------+-----+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+-----+---------+-------+
| C1 | NUMBER(38) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | YES | NULL | NULL | NULL |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
obclient> ALTER TABLE test ADD c3 int;
Query OK, 0 rows affected (0.03 sec)
obclient> DESCRIBE test;
+-------+--------------+------+-----+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+-----+---------+-------+
| C1 | NUMBER(38) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | YES | NULL | NULL | NULL |
| C3 | NUMBER(38) | YES | NULL | NULL | NULL |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
修改列属性,支持修改列名称和列类型。
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 (0.01 sec)
obclient>ALTER TABLE test CHANGE COLUMN c2 c CHAR(60);
Query OK, 0 rows affected (0.03 sec)
obclient> DESCRIBE test;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c | char(60) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
Oracle 模式下的修改列示例
obclient> DESCRIBE test;
+-------+--------------+------+-----+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+-----+---------+-------+
| C1 | NUMBER(38) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | YES | NULL | NULL | NULL |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
obclient> ALTER TABLE test MODIFY COLUMN c2 CHAR(60);
删除列,支持删除表中的列,但不允许删除主键列或包含索引的列。
MySQL 模式下的删除列示例
obclient> DESCRIBE test;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c | char(60) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
obclient> ALTER TABLE test DROP c;
Query OK, 0 rows affected (0.04 sec)
obclient> DESCRIBE test;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.01 sec)
Oracle 模式下的删除列示例
obclient> DESCRIBE test;
+-------+--------------+------+-----+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+-----+---------+-------+
| C1 | NUMBER(38) | NO | PRI | NULL | NULL |
| C2 | VARCHAR2(50) | YES | NULL | NULL | NULL |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
obclient> ALTER TABLE test DROP COLUMN c2;
Query OK, 0 rows affected (0.04 sec)
obclient> DESCRIBE test;
+-------+--------------+------+-----+---------+-------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------+--------------+------+-----+---------+-------+
| C1 | NUMBER(38) | NO | PRI | NULL | NULL |
+-------+--------------+------+-----+---------+-------+
1 rows in set (0.00 sec)
修改索引
MySQL 模式
OceanBase 数据库的 MySQL 模式支持增加唯一索引和普通索引,同时还支持修改索引的属性。
增加唯一索引
OceanBase 数据库支持在创建表后为表增加唯一索引。如果创建表时同时设置了主键,OceanBase 数据库会默认为主键列创建一个唯一索引。
增加唯一索引的示例如下:
obclient> CREATE TABLE test (c1 int PRIMARY KEY, c2 VARCHAR(50));
Query OK, 0 rows affected (0.04 sec)
obclient> ALTER TABLE test ADD UNIQUE INDEX index_name(c2);
Query OK, 0 rows affected (0.53 sec)
增加普通索引
OceanBase 数据库的 MySQL 模式支持一次增加多个索引,索引关键字用
INDEX
或KEY
均可以。obclient> CREATE TABLE test (c1 int PRIMARY KEY, c2 VARCHAR(50));
Query OK, 0 rows affected (0.04 sec)
obclient> ALTER TABLE test ADD INDEX myidx(c1,c2);
Query OK, 0 rows affected (0.55 sec)
修改索引属性
OceanBase 数据库的 MySQL 模式支持将索引修改为可见或不可见,默认索引均可见,您可以将索引修改为不可见。
语法如下:
obclient> ALTER TABLE test ALTER INDEX myidx INVISIBLE;
Oracle 模式
OceanBase 数据库的 Oracle 模式支持为非分区表增加唯一索引。
示例如下:
增加唯一索引
obclient> CREATE TABLE test (c1 int PRIMARY KEY, c2 VARCHAR(50));
Query OK, 0 rows affected (0.04 sec)
obclient> ALTER TABLE test ADD UNIQUE(c2);
重命名表
表创建成功后,您可以更改表名。
OceanBase 数据库的 MySQL 模式和 Oracle 模式均支持重命名表。
示例如下:
obclient> ALTER TABLE test RENAME TO t1;
删除表组
OceanBase 数据库的 MySQL 模式支持删除表所属的表组。
MySQL 模式下删除表组的示例如下:
obclient> ALTER TABLE test DROP TABLEGROUP grp1;
更多表组相关信息,请参见 管理表组 章节。
删除外键
OceanBase 数据库的 MySQL 模式和 Oracle 模式均支持删除表的外键。
MySQL 模式下删除表的外键示例
obclient> ALTER TABLE test DROP FOREIGN KEY fk_name;
Oracle 模式下删除表的外键示例
obclient> ALTER TABLE test DROP CONSTRAINT fk_name;