首批通过分布式安全可靠测评,为关键业务系统打造
ALTER TABLE
更新时间:2024-12-02 16:41:05
描述
该语句用来修改已存在的表的结构,包括修改表及表属性、新增列、修改列及属性、删除列等。
语法
alter_table_stmt:
ALTER TABLE table_name alter_table_action_list;
alter_table_action_list:
alter_table_action [, alter_table_action ...]
alter_table_action:
ADD {column_definition | (column_definition_list)}
| ADD [CONSTRAINT [constraint_name]] UNIQUE (column_name [, column_name ]...)
| ADD [CONSTRAINT [constraint_name]] FOREIGN KEY (column_name_list) references_clause
| ADD [CONSTRAINT [constraint_name]] CHECK (expr)
| ADD CONSTRAINT constraint_name PRIMARY KEY (column_name)
| ADD CONSTRAINT constraint_name FOREIGN KEY(foreign_col_name) REFERENCES
reference_tbl_name(column_name);
| ALTER INDEX index_name [VISIBLE | INVISIBLE]
| ADD range_partition_list
| DROP {PARTITION | SUBPARTITION} partition_name_list [UPDATE GLOBAL INDEXES]
| DROP TABLEGROUP
| DROP CONSTRAINT constraint_name
| DROP PRIMARY KEY
| DROP COLUMN column_name
| {ENABLE | DISABLE} CONSTRAINT constraint_name
| MODIFY [COLUMN] column_definition
| MODIFY CONSTRAINT constraint_name { ENABLE | DISABLE }
| MODIFY PRIMARY KEY (column_name_list)
| RENAME [TO] table_name
| RENAME COLUMN old_col_name TO new_col_name
| SET TABLEGROUP tablegroup_name
| [SET] table_option_list
| TRUNCATE {PARTITION | SUBPARTITION} partition_name_list [UPDATE GLOBAL INDEXES]
rename_table_action_list:
rename_table_action [, rename_table_action ...]
rename_table_action:
table_name TO table_name
column_definition_list:
column_definition [, column_definition ...]
column_definition:
column_name data_type
[GENERATED BY DEFAULT AS IDENTITY | GENERATED ALWAYS AS IDENTITY]
[DEFAULT const_value]
[NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] comment
column_desc_list:
column_desc [, column_desc ...]
column_desc:
column_name [(length)] [ASC | DESC]
references_clause:
REFERENCES table_name [ (column_name, column_name ...) ] [ON DELETE {CASCADE}]
index_option:
[GLOBAL | LOCAL]
| block_size
| compression
| STORING(column_name_list)
| comment
table_option_list:
table_option [ table_option ...]
table_option:
table_group
| block_size
| compression
| comment
| parallel_clause
parallel_clause:
{NOPARALLEL | PARALLEL integer}
partition_option:
PARTITION BY HASH(column_name_list)
[subpartition_option] hash_partition_define
| PARTITION BY RANGE (column_name_list)
[subpartition_option] (range_partition_list)
| PARTITION BY LIST (column_name_list)
[subpartition_option] (list_partition_list)
/*模板化二级分区*/
subpartition_option:
SUBPARTITION BY HASH (column_name_list) hash_subpartition_define
| SUBPARTITION BY RANGE (column_name_list) SUBPARTITION TEMPLATE
(range_subpartition_list)
| SUBPARTITION BY LIST (column_name_list) SUBPARTITION TEMPLATE
(list_subpartition_list)
/*非模板化二级分区*/
subpartition_option:
SUBPARTITION BY HASH (column_name_list)
| SUBPARTITION BY RANGE (column_name_list)
| SUBPARTITION BY LIST (column_name_list)
subpartition_list:
(hash_subpartition_list)
| (range_subpartition_list)
| (list_subpartition_list)
hash_partition_define:
PARTITIONS partition_count [TABLESPACE tablespace] [compression]
| (hash_partition_list)
hash_partition_list:
hash_partition [, hash_partition, ...]
hash_partition:
partition [partition_name] [subpartition_list/*仅非模板化二级分区可定义*/]
hash_subpartition_define:
SUBPARTITIONS subpartition_count
| SUBPARTITION TEMPLATE (hash_subpartition_list)
hash_subpartition_list:
hash_subpartition [, hash_subpartition, ...]
hash_subpartition:
subpartition [subpartition_name]
range_partition_list:
range_partition [, range_partition ...]
range_partition:
PARTITION [partition_name]
VALUES LESS THAN {(expression_list) | (MAXVALUE)}
[subpartition_list/*仅非模板化二级分区可定义*/]
[ID = num] [physical_attribute_list] [compression]
range_subpartition_list:
range_subpartition [, range_subpartition ...]
range_subpartition:
SUBPARTITION subpartition_name
VALUES LESS THAN {(expression_list) | MAXVALUE} [physical_attribute_list]
list_partition_list:
list_partition [, list_partition] ...
list_partition:
PARTITION [partition_name]
VALUES (DEFAULT|expression_list)
[subpartition_list/*仅非模板化二级分区可定义*/]
[ID num] [physical_attribute_list] [compression]
list_subpartition_list:
list_subpartition [, list_subpartition] ...
list_subpartition:
SUBPARTITION [partition_name] VALUES (DEFAULT|expression_list) [physical_attribute_list]
expression_list:
expression [, expression ...]
column_name_list:
column_name [, column_name ...]
partition_name_list:
partition_name [, partition_name ...]
partition_count | subpartition_count:
INT_VALUE
语法说明
| 参数 | 描述 |
|---|---|
| ADD | 增加列,目前不支持增加主键列。 |
| MODIFY COLUMN | 修改列属性。 |
| MODIFY CONSTRAINT | 修改约束的状态为开启或关闭,只支持外键约束和 CHECK 约束。 |
| DROP PRIMARY KEY | 删除主键。 说明 对于 Oracle 模式,如果表是外键信息的父表,则不允许删除主键。 |
| DROP COLUMN | 删除列,不允许删除主键列或者包含索引的列。 |
| ADD UNIQUE | 增加唯一索引。 |
| ADD INDEX | 增加普通索引 |
| ALTER INDEX | 修改索引属性。 |
| ADD PARTITION | 增加分区。 |
| DROP {PARTITION | SUBPARTITION} | 删除分区:
UPDATE GLOBAL INDEXES,则删除分区时会同步更新全局索引;如果不指定,分区表上的全局索引需要处于不可用状态。 多个分区名称之间用逗号分隔。 注意 删除分区时,请尽量避免该分区上存在活动的事务或查询,否则可能会导致 SQL 语句报错,或者一些异常情况。 |
| TRUNCATE {PARTITION | SUBPARTITION} | 删除分区数据:
UPDATE GLOBAL INDEXES,则清除分区数据时会同步更新全局索引;如果不指定,分区表上的全局索引需要处于不可用状态。 多个分区名称之间用逗号分隔。 注意 删除分区数据时,请尽量避免该分区上存在活动的事务或查询,否则可能会导致 SQL 语句报错,或者一些异常情况。 |
| RENAME [TO] table_name | 表重命名。 |
| DROP TABLEGROUP | 删除表组。 |
| SET TABLEGROUP | 设置表归属于哪个表组。 |
| DROP CONSTRAINT | 删除约束。 |
| SET BLOCK_SIZE | 设置 Partition 表 BLOCK 大小。 |
| SET COMPRESSION | 设置表的压缩方式。 |
| SET USE_BLOOM_FILTER | 设置是否使用 BloomFilter。 |
| SET COMMENT | 设置注释信息。 |
| SET PROGRESSIVE_MERGE_NUM | 设置渐进合并步数,取值范围是 [1,64]。 |
| parallel_clause | 指定表级别的并行度:
ALTER SESSION 指定的并行度 > 表级别的并行度。 |
| {ENABLE | DISABLE} CONSTRAINT constraint_name | 修改约束的状态,支持外键约束或 CHECK 约束。 |
| MODIFY PRIMARY KEY | 修改主键。 |
示例
修改表
tbl1中字段col1的字段类型。obclient> CREATE TABLE tbl1(col1 VARCHAR(3)); Query OK, 0 rows affected obclient> ALTER TABLE tbl1 MODIFY col1 CHAR(10); Query OK, 0 rows affected obclient> DESCRIBE tbl1; +-------+----------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+----------+------+-----+---------+-------+ | COL1 | CHAR(10) | YES | NULL | NULL | NULL | +-------+----------+------+-----+---------+-------+ 1 row in set修改表
tbl1中列col1的名称为col2。obclient> ALTER TABLE tbl1 RENAME COLUMN col1 TO col2; Query OK, 0 rows affected obclient> DESCRIBE tbl1; +-------+-------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+-------------+------+-----+---------+-------+ | COL2 | VARCHAR2(10) | YES | NULL | NULL | NULL | +-------+-------------+------+-----+---------+-------+ 1 row in set增加和删除列。
创建表
tbl2。obclient> CREATE TABLE tbl2 (col1 NUMBER(30) PRIMARY KEY,col2 VARCHAR(50)); Query OK, 0 rows affected对表
tbl2增加col3列。obclient> ALTER TABLE tbl2 ADD col3 NUMBER(30); Query OK, 0 rows affected obclient> DESCRIBE tbl2; +-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | COL1 | NUMBER(30) | NO | PRI | NULL | NULL | | COL2 | VARCHAR2(50) | YES | NULL | NULL | NULL | | COL3 | NUMBER(30) | YES | NULL | NULL | NULL | +-------+--------------+------+-----+---------+-------+ 3 rows in set删除表
tbl2的col3列。obclient> ALTER TABLE tbl2 DROP COLUMN col3; Query OK, 0 rows affected obclient> DESCRIBE tbl2; +-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | COL1 | NUMBER(30) | NO | PRI | NULL | NULL | | COL2 | VARCHAR2(50) | YES | NULL | NULL | NULL | +-------+--------------+------+-----+---------+-------+ 2 rows in set为表
tbl2创建唯一性索引。obclient> CREATE TABLE tbl2 (col1 NUMBER(30) PRIMARY KEY,col2 VARCHAR(50), col3 INT); Query OK, 0 rows affected obclient> ALTER TABLE tbl2 ADD CONSTRAINT constraint_TBL2 UNIQUE (col2, col3); Query OK, 0 rows affected obclient [SYS]> DESC tbl2; +-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | COL1 | NUMBER(30) | NO | PRI | NULL | NULL | | COL2 | VARCHAR2(50) | YES | MUL | NULL | NULL | | COL3 | NUMBER(38) | YES | NULL | NULL | NULL | +-------+--------------+------+-----+---------+-------+ 3 rows in set obclient> INSERT INTO tbl2 VALUES('1','2','2'); Query OK, 1 row affected obclient> INSERT INTO tbl2 VALUES('2','2','2'); ORA-00001: unique constraint '2-2' for key 'CONSTRAINT_TBL2' violated obclient> INSERT INTO tbl2 VALUES('2','3','2'); Query OK, 1 row affected
为非模板化二级分区表
tbl3的一级分区p1下添加二级分区p1_r4。obclient> ALTER TABLE tbl3 MODIFY PARTITION p1 ADD SUBPARTITION p1_r4 VALUES LESS THAN(2022); Query OK, 0 rows affected删除非模板化二级分区表
tbl3的二级分区p3_r3。obclient> ALTER TABLE tbl3 DROP SUBPARTITION p2_r3; Query OK, 0 rows affected为非模板化二级分区表
tbl3添加一级分区p4,需要同时指定一级分区的定义和该分区下的二级分区定义。obclient> ALTER TABLE tbl3 ADD PARTITION p4 VALUES LESS THAN (400) ( SUBPARTITION p4_r1 VALUES LESS THAN (2019), SUBPARTITION p4_r2 VALUES LESS THAN (2020), SUBPARTITION p4_r3 VALUES LESS THAN (2021) ); Query OK, 0 rows affected为模板化二级分区表
tbl4添加一级分区p3,只需要指定一级分区的定义,二级分区的定义会自动按照模板填充。obclient> CREATE TABLE tbl4(col1 INT, col2 INT, PRIMARY KEY(col1,col2)) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(col2) SUBPARTITION TEMPLATE ( SUBPARTITION p0 VALUES LESS THAN (50), SUBPARTITION p1 VALUES LESS THAN (100) ) ( PARTITION p0 VALUES LESS THAN (100), PARTITION p1 VALUES LESS THAN (200), PARTITION p2 VALUES LESS THAN (300) ); Query OK, 0 rows affected obclient> ALTER TABLE tbl4 ADD PARTITION p3 VALUES LESS THAN (400); Query OK, 0 rows affected修改表
tbl5的并行度为3。obclient> CREATE TABLE tbl5(col1 int primary key, col2 int) PARALLEL 5; Query OK, 0 rows affected obclient> ALTER TABLE tbl5 PARALLEL 3; Query OK, 0 rows affected修改外键约束的状态。
obclient> CREATE TABLE MMS_GROUPUSER ( "ID" VARCHAR2(254 BYTE) NOT NULL, "GROUPID" VARCHAR2(254 BYTE), "USERID" VARCHAR2(254 BYTE), CONSTRAINT "PK_MMS_GROUPUSER" PRIMARY KEY ("ID"), CONSTRAINT "FK_MMS_GROUPUSER_02" FOREIGN KEY ("GROUPID") REFERENCES MMS_GROUPUSER ("ID") ON DELETE CASCADE DISABLE ); Query OK, 0 rows affected obclient> SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,STATUS FROM user_constraints WHERE CONSTRAINT_NAME LIKE 'FK_MMS_GROUPUSE%'; +---------------------+-----------------+---------------+----------+ | CONSTRAINT_NAME | CONSTRAINT_TYPE | TABLE_NAME | STATUS | +---------------------+-----------------+---------------+----------+ | FK_MMS_GROUPUSER_02 | R | MMS_GROUPUSER | DISABLED | +---------------------+-----------------+---------------+----------+ 1 row in set obclient> ALTER TABLE MMS_GROUPUSER ENABLE CONSTRAINT FK_MMS_GROUPUSER_02; Query OK, 0 rows affected obclient> SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,STATUS FROM user_constraints WHERE CONSTRAINT_NAME LIKE 'FK_MMS_GROUPUSE%'; +---------------------+-----------------+---------------+---------+ | CONSTRAINT_NAME | CONSTRAINT_TYPE | TABLE_NAME | STATUS | +---------------------+-----------------+---------------+---------+ | FK_MMS_GROUPUSER_02 | R | MMS_GROUPUSER | ENABLED | +---------------------+-----------------+---------------+---------+ 1 row in set清空分区表
tbl6的分区M202001和M202002中的全部数据。obclient> CREATE TABLE tbl6 (log_id number NOT NULL,log_value varchar2(50),log_date date NOT NULL DEFAULT sysdate) PARTITION BY RANGE(log_date) ( PARTITION M202001 VALUES LESS THAN(TO_DATE('2020/02/01','YYYY/MM/DD')) , PARTITION M202002 VALUES LESS THAN(TO_DATE('2020/03/01','YYYY/MM/DD')) , PARTITION M202003 VALUES LESS THAN(TO_DATE('2020/04/01','YYYY/MM/DD')) , PARTITION M202004 VALUES LESS THAN(TO_DATE('2020/05/01','YYYY/MM/DD')) , PARTITION M202005 VALUES LESS THAN(TO_DATE('2020/06/01','YYYY/MM/DD')) , PARTITION MMAX VALUES LESS THAN (MAXVALUE) ); Query OK, 0 rows affected obclient> ALTER TABLE tbl6 TRUNCATE PARTITION M202001, M202002 UPDATE GLOBAL INDEXES; Query OK, 0 rows affected删除表
tbl7的CHECK约束tbl7_equal_check1。obclient> CREATE TABLE tbl7 (col1 INT, col2 INT, col3 INT,CONSTRAINT tbl7_equal_check1 CHECK(col2 = col3 * 2) ENABLE VALIDATE); Query OK, 0 rows affected obclient> SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,STATUS FROM user_constraints WHERE TABLE_NAME LIKE 'TBL%'; +-------------------+-----------------+------------+---------+ | CONSTRAINT_NAME | CONSTRAINT_TYPE | TABLE_NAME | STATUS | +-------------------+-----------------+------------+---------+ | TBL8_EQUAL_CHECK1 | C | TBL8 | ENABLED | | TBL7_EQUAL_CHECK1 | C | TBL7 | ENABLED | +-------------------+-----------------+------------+---------+ 2 rows in set obclient> ALTER TABLE tbl7 DROP CONSTRAINT tbl7_equal_check1; Query OK, 0 rows affected obclient> SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,STATUS FROM user_constraints WHERE TABLE_NAME LIKE 'TBL%'; +-------------------+-----------------+------------+---------+ | CONSTRAINT_NAME | CONSTRAINT_TYPE | TABLE_NAME | STATUS | +-------------------+-----------------+------------+---------+ | TBL8_EQUAL_CHECK1 | C | TBL8 | ENABLED | +-------------------+-----------------+------------+---------+ 1 row in set把表
tbl8从表组tblgroup1中移到表组tblgroup2中。obclient> SHOW TABLEGROUPS; +-----------------+------------+---------------+ | TABLEGROUP_NAME | TABLE_NAME | DATABASE_NAME | +-----------------+------------+---------------+ | TBLGROUP1 | TBL8 | SYS | | TBLGROUP2 | NULL | NULL | | oceanbase | NULL | NULL | +-----------------+------------+---------------+ 3 rows in set obclient> ALTER TABLE tbl8 SET TABLEGROUP tblgroup2; Query OK, 0 rows affected obclient> SHOW TABLEGROUPS; +-----------------+------------+---------------+ | TABLEGROUP_NAME | TABLE_NAME | DATABASE_NAME | +-----------------+------------+---------------+ | TBLGROUP1 | NULL | NULL | | TBLGROUP2 | TBL8 | SYS | | oceanbase | NULL | NULL | +-----------------+------------+---------------+ 3 rows in set为表
primary_table添加外键约束cons_fk1。obclient> CREATE TABLE primary_table (id NUMBER PRIMARY KEY, names VARCHAR(100) NOT NULL, foreign_col NUMBER); Query OK, 0 rows affected obclient> CREATE TABLE reference_table (id NUMBER PRIMARY key, comments VARCHAR2(100) NOT NULL); Query OK, 0 rows affected obclient> ALTER TABLE primary_table ADD CONSTRAINT cons_fk1 FOREIGN KEY(foreign_col) REFERENCES reference_table(id); Query OK, 0 rows affected为表
tbl9添加主键约束tbl1_pk。obclient> CREATE TABLE tbl9 (col1 NUMBER, col2 INT,col3 VARCHAR2(100)); Query OK, 0 rows affected obclient> ALTER TABLE tbl9 ADD CONSTRAINT tbl1_pk PRIMARY KEY (col1); Query OK, 0 rows affected修改表
tbl9的主键为col2列。obclient> ALTER TABLE tbl9 MODIFY PRIMARY KEY(col2); Query OK, 0 rows affected删除表
tbl9的主键。obclient> ALTER TABLE tbl9 DROP PRIMARY KEY; Query OK, 0 rows affected