描述

该语句用来修改已存在的表的结构,比如:修改表及表属性、新增列、修改列及属性、删除列等。

格式

  1. alter_table_stmt:
  2. ALTER TABLE table_name
  3. alter_table_action_list;
  4. | RENAME TABLE rename_table_action_list;
  5. alter_table_action_list:
  6. alter_table_action [, alter_table_action ...]
  7. alter_table_action:
  8. ADD {column_definition | (column_definition_list)}
  9. | MODIFY [COLUMN] column_definition
  10. | MODIFY CONSTRAINT constraint_name { ENABLE | DISABLE }
  11. | DROP [COLUMN] column_name
  12. | ADD [CONSTRAINT [constraint_name]] UNIQUE {INDEX | KEY} [index_name] index_desc
  13. | ADD [CONSTRAINT [constraint_name]] FOREIGN KEY (column_name_list) references_clause
  14. | ADD [CONSTRAINT [constraint_name]] CHECK (expr)
  15. | ADD {INDEX | KEY} [index_name] index_desc
  16. | ADD FULLTEXT [INDEX | KEY] [index_name] fulltext_index_desc
  17. | ALTER INDEX index_name [VISIBLE | INVISIBLE]
  18. | DROP {INDEX | KEY} index_name
  19. | ADD PARTITION (range_partition_list)
  20. | DROP {PARTITION | SUBPARTITION} partition_name_list [UPDATE GLOBAL INDEXES]
  21. | REORGANIZE PARTITION name_list INTO partition_range_or_list
  22. | TRUNCATE {PARTITION | SUBPARTITION} partition_name_list [UPDATE GLOBAL INDEXES]
  23. | [SET] table_option_list
  24. | RENAME [TO] table_name
  25. | DROP TABLEGROUP
  26. | DROP CONSTRAINT constraint_name
  27. | {ENABLE | DISABLE} CONSTRAINT constraint_name
  28. rename_table_action_list:
  29. rename_table_action [, rename_table_action ...]
  30. rename_table_action:
  31. table_name TO table_name
  32. column_definition_list:
  33. column_definition [, column_definition ...]
  34. column_definition:
  35. column_name data_type
  36. [DEFAULT const_value] [AUTO_INCREMENT]
  37. [NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] comment
  38. index_desc:
  39. (column_desc_list) [index_type] [index_option_list]
  40. fulltext_index_desc:
  41. (column_desc_list) CTXCAT(column_desc_list) [index_option_list]
  42. column_desc_list:
  43. column_desc [, column_desc ...]
  44. column_desc:
  45. column_name [(length)] [ASC | DESC]
  46. references_clause:
  47. REFERENCES table_name [ (column_name, column_name ...) ] [ON DELETE {CASCADE}]]
  48. index_type:
  49. USING BTREE
  50. index_option_list:
  51. index_option [ index_option ...]
  52. index_option:
  53. [GLOBAL | LOCAL]
  54. | block_size
  55. | compression
  56. | STORING(column_name_list)
  57. | comment
  58. table_option_list:
  59. table_option [ table_option ...]
  60. table_option:
  61. | primary_zone
  62. | replica_num
  63. | table_tablegroup
  64. | block_size
  65. | compression
  66. | AUTO_INCREMENT [=] INT_VALUE
  67. | comment
  68. | DUPLICATE_SCOPE [=] "none|zone|region|cluster"
  69. | parallel_clause
  70. parallel_clause:
  71. {NOPARALLEL | PARALLEL integer}
  72. partition_option:
  73. PARTITION BY HASH(column_name_list)
  74. [subpartition_option] hash_partition_define
  75. | PARTITION BY RANGE (column_name_list)
  76. [subpartition_option] (range_partition_list)
  77. | PARTITION BY LIST (column_name_list)
  78. [subpartition_option] (list_partition_list)
  79. /*模板化二级分区*/
  80. subpartition_option:
  81. SUBPARTITION BY HASH (column_name_list) hash_subpartition_define
  82. | SUBPARTITION BY RANGE (column_name_list) SUBPARTITION TEMPLATE
  83. (range_subpartition_list)
  84. | SUBPARTITION BY LIST (column_name_list) SUBPARTITION TEMPLATE
  85. (list_subpartition_list)
  86. /*非模板化二级分区*/
  87. subpartition_option:
  88. SUBPARTITION BY HASH (column_name_list)
  89. | SUBPARTITION BY RANGE (column_name_list)
  90. | SUBPARTITION BY LIST (column_name_list)
  91. subpartition_list:
  92. (hash_subpartition_list)
  93. | (range_subpartition_list)
  94. | (list_subpartition_list)
  95. hash_partition_define:
  96. PARTITIONS partition_count [TABLESPACE tablespace] [compression]
  97. | (hash_partition_list)
  98. hash_partition_list:
  99. hash_partition [, hash_partition, ...]
  100. hash_partition:
  101. partition [partition_name] [subpartition_list/*仅非模板化二级分区可定义*/]
  102. hash_subpartition_define:
  103. SUBPARTITIONS subpartition_count
  104. | SUBPARTITION TEMPLATE (hash_subpartition_list)
  105. hash_subpartition_list:
  106. hash_subpartition [, hash_subpartition, ...]
  107. hash_subpartition:
  108. subpartition [subpartition_name]
  109. range_partition_list:
  110. range_partition [, range_partition ...]
  111. range_partition:
  112. PARTITION [partition_name]
  113. VALUES LESS THAN {(expression_list) | (MAXVALUE)}
  114. [subpartition_list/*仅非模板化二级分区可定义*/]
  115. [ID = num] [physical_attribute_list] [compression]
  116. range_subpartition_list:
  117. range_subpartition [, range_subpartition ...]
  118. range_subpartition:
  119. SUBPARTITION subpartition_name
  120. VALUES LESS THAN {(expression_list) | MAXVALUE} [physical_attribute_list]
  121. list_partition_list:
  122. list_partition [, list_partition] ...
  123. list_partition:
  124. PARTITION [partition_name]
  125. VALUES (DEFAULT|expression_list)
  126. [subpartition_list/*仅非模板化二级分区可定义*/]
  127. [ID num] [physical_attribute_list] [compression]
  128. list_subpartition_list:
  129. list_subpartition [, list_subpartition] ...
  130. list_subpartition:
  131. SUBPARTITION [partition_name] VALUES (DEFAULT|expression_list) [physical_attribute_list]
  132. expression_list:
  133. expression [, expression ...]
  134. column_name_list:
  135. column_name [, column_name ...]
  136. partition_name_list:
  137. partition_name [, partition_name ...]
  138. partition_count | subpartition_count:
  139. INT_VALUE

参数解释

参数

描述

ADD

增加列,目前不支持增加主键列。

MODIFY [COLUMN]

修改列属性。

MODIFY CONSTRAINT

修改约束的状态为开启或关闭,只支持外键约束和 CHECK 约束。

DROP [COLUMN]

删除列,不允许删除主键列或者包含索引的列。

ADD [UNIQUE INDEX]

增加唯一索引。

ADD [INDEX]

增加普通索引

ALTER [INDEX]

修改索引属性。

ADD [PARTITION]

增加分区。

DROP {PARTITION | SUBPARTITION}

删除分区:

  • PARTITION:针对 RANGE、LIST 类型的一级分区,删除指定的分区(如果指定分区下存在二级分区,会同时删除该一级分区下的所有二级分区),包括分区定义和其中的数据,同时对分区上存在的本地索引进行维护。

  • SUBPARTITION:针对 -RANGE、-LIST 类型的二级分区,删除指定的二级分区,包括分区定义和其中的数据。同时对分区上存在的本地索引进行维护。

如果指定 UPDATE GLOBAL INDEXES,则删除分区时会同步更新全局索引;如果不指定,分区表上的全局索引需要处于不可用状态。

多个分区名称之间用逗号分隔。

REORGANIZE [PARTITION]

分区重组。

TRUNCATE {PARTITION | SUBPARTITION}

删除分区数据:

  • PARTITION:针对 RANGE、LIST 类型的一级分区,清除指定分区中的全部数据(如果指定分区下存在二级分区,会同时清除该一级分区下的所有二级分区中的数据),同时对分区上存在的本地索引进行维护。

  • SUBPARTITION:针对 -RANGE、-LIST 类型的二级分区,清除指定二级分区中的全部数据。同时对分区上存在的本地索引进行维护。

如果指定 UPDATE GLOBAL INDEXES,则清除分区数据时会同步更新全局索引;如果不指定,分区表上的全局索引需要处于不可用状态。

多个分区名称之间用逗号分隔。

RENAME [TO] table_name

表重命名。

DROP [TABLEGROUP]

删除表组。

DROP [CONSTRAINT]

删除约束。

SET BLOCK_SIZE

设置 Partition 表 BLOCK 大小。

SET REPLICA_NUM

设置表的副本数(指表的副本总数)。

SET COMPRESSION

设置表的压缩方式。

SET USE_BLOOM_FILTER

设置是否使用 BloomFilter。

SET COMMENT

设置注释信息。

SET PROGRESSIVE_MERGE_NUM

设置渐进合并步数,取值范围是 1~64。

parallel_clause

指定表级别的并行度:

  • NOPARALLEL:并行度为 1,默认配置

  • PARALLEL integer:指定并行度,integer 取值大于等于 1。

注意

当指定并行度时,优先级关系如下:通过 hint 指定的并行度 > 通过 ALTER SESSION 指定的并行度 > 表级别的并行度

{ENABLE | DISABLE} CONSTRAINT constraint_name

修改约束的状态,支持外键约束或 CHECK 约束。

示例

  • 示例:修改表 t2 中字段 d 的字段类型。
  1. obclient>CREATE TABLE t2(d VARCHAR(3));
  2. Query OK, 0 rows affected (0.04 sec)
  3. obclient>ALTER TABLE t2 MODIFY d CHAR(10);
  4. Query OK, 0 rows affected (0.04 sec)
  • 示例:增加、删除列。

    1. obclient> CREATE TABLE test (c1 NUMBER(30) PRIMARY KEY,c2 VARCHAR(50));
    2. Query OK, 0 rows affected (0.07 sec)
  • 增加列前,执行DESCRIBE test; 命令查看表信息:

    1. obclient> DESCRIBE test;
    2. +-------+--------------+------+-----+---------+-------+
    3. | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
    4. +-------+--------------+------+-----+---------+-------+
    5. | C1 | NUMBER(30) | NO | PRI | NULL | NULL |
    6. | C2 | VARCHAR2(50) | YES | NULL | NULL | NULL |
    7. +-------+--------------+------+-----+---------+-------+
  • 执行以下命令增加 c3 列:

    1. obclient> ALTER TABLE test ADD c3 NUMBER(30);
    2. Query OK, 0 rows affected (0.02 sec)
  • 增加列后,执行DESCRIBE test; 命令查看表信息:

    1. obclient> DESCRIBE test;
    2. +-------+--------------+------+-----+---------+-------+
    3. | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
    4. +-------+--------------+------+-----+---------+-------+
    5. | C1 | NUMBER(30) | NO | PRI | NULL | NULL |
    6. | C2 | VARCHAR2(50) | YES | NULL | NULL | NULL |
    7. | C3 | NUMBER(30) | YES | NULL | NULL | NULL |
    8. +-------+--------------+------+-----+---------+-------+
    9. 3 rows in set (0.00 sec)
  • 执行以下命令删除 c3 列:

    1. obclient> ALTER TABLE test DROP column c3;
    2. Query OK, 0 rows affected (0.02 sec)
  • 删除列后,执行 DESCRIBE test; 命令查看表信息:

    1. obclient> DESCRIBE test;
    2. +-------+--------------+------+-----+---------+-------+
    3. | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
    4. +-------+--------------+------+-----+---------+-------+
    5. | C1 | NUMBER(30) | NO | PRI | NULL | NULL |
    6. | C2 | VARCHAR2(50) | YES | NULL | NULL | NULL |
    7. +-------+--------------+------+-----+---------+-------+
    8. 2 rows in set (0.00 sec)
  • 示例:设置表格 test 的副本数,并且增加列 c5。

  1. obclient> ALTER TABLE test SET REPLICA_NUM=2, ADD c5 INT;
  2. Query OK, 0 rows affected (0.02 sec)
  • 为非模板化二级分区表 t_range_range1 添加二级分区 p1_r4。
  1. obclient>ALTER TABLE t_range_range1 MODIFY partition p1 ADD subpartition p1_r4 values less than (400);
  2. Query OK, 0 rows affected (0.08 sec)
  • 删除非模板化二级分区表 t_range_range1 的二级分区 p2_r1。
  1. obclient>ALTER TABLE t_range_range1 DROP subpartition p2_r1;
  2. Query OK, 0 rows affected (0.08 sec)
  • 为非模板化二级分区表 t_range_range1 添加一级分区 p4,需要同时指定一级分区的定义和该分区下的二级分区定义。
  1. obclient>ALTER TABLE t_range_range1 ADD partition p4 values less than (500) (
  2. subpartition p4_r1 values less than (100),
  3. subpartition p4_r2 values less than (200),
  4. subpartition p5_r3 values less than (300)
  5. );
  6. Query OK, 0 rows affected (0.08 sec)
  • 为模板化二级分区表 t_range_range 添加一级分区 p3,只需要指定一级分区的定义,二级分区的定义会自动按照模板填充。
  1. obclient>CREATE TABLE t_range_range(c1 INT, c2 INT, PRIMARY KEY(c1,c2))
  2. PARTITION BY RANGE(c1) SUBPARTITION BY RANGE(c2) SUBPARTITION TEMPLATE
  3. (SUBPARTITION p0 VALUES LESS THAN (50),SUBPARTITION p1 VALUES LESS THAN (100))
  4. (PARTITION p0 VALUES LESS THAN (100), PARTITION p1 VALUES LESS THAN (200),
  5. PARTITION p2 VALUES LESS THAN (300));
  6. Query OK, 0 rows affected (0.07 sec)
  7. obclient>ALTER TABLE t_range_range ADD PARTITION p3 VALUES LESS THAN (400);
  8. Query OK, 0 rows affected (0.07 sec)
  • 修改表 t1 的并行度为 3。
  1. obclient> ALTER TABLE t1 PARALLEL 3;
  2. Query OK, 0 rows affected (0.06 sec)
  • 修改外键约束的状态
  1. obclient> CREATE TABLE MMS_GROUPUSER (
  2. "ID" VARCHAR2(254 BYTE) NOT NULL,
  3. "GROUPID" VARCHAR2(254 BYTE),
  4. "USERID" VARCHAR2(254 BYTE),
  5. CONSTRAINT "PK_MMS_GROUPUSER" PRIMARY KEY ("ID"),
  6. CONSTRAINT "FK_MMS_GROUPUSER_02" FOREIGN KEY ("GROUPID") REFERENCES MMS_GROUPUSER ("ID") ON DELETE CASCADE DISABLE
  7. );
  8. Query OK, 0 rows affected (0.09 sec)
  9. obclient> select CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,STATUS from user_constraints where CONSTRAINT_NAME like 'FK_MMS_GROUPUSE%';
  10. +---------------------+-----------------+---------------+----------+
  11. | CONSTRAINT_NAME | CONSTRAINT_TYPE | TABLE_NAME | STATUS |
  12. +---------------------+-----------------+---------------+----------+
  13. | FK_MMS_GROUPUSER_02 | R | MMS_GROUPUSER | DISABLED |
  14. +---------------------+-----------------+---------------+----------+
  15. 1 row in set (0.00 sec)
  16. obclient> ALTER TABLE MMS_GROUPUSER ENABLE CONSTRAINT FK_MMS_GROUPUSER_02;
  17. Query OK, 0 rows affected (0.21 sec)
  18. obclient> select CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,STATUS from user_constraints where CONSTRAINT_NAME like 'FK_MMS_GROUPUSE%';
  19. +---------------------+-----------------+---------------+---------+
  20. | CONSTRAINT_NAME | CONSTRAINT_TYPE | TABLE_NAME | STATUS |
  21. +---------------------+-----------------+---------------+---------+
  22. | FK_MMS_GROUPUSER_02 | R | MMS_GROUPUSER | ENABLED |
  23. +---------------------+-----------------+---------------+---------+
  24. 1 row in set (0.15 sec)
  • 清空分区表 t_log_part_by_range 的分区 M202001 和 M202002 中的全部数据。
  1. obclient> CREATE TABLE t_log_part_by_range (
  2. log_id number NOT NULL
  3. , log_value varchar2(50)
  4. , log_date date NOT NULL DEFAULT sysdate
  5. ) PARTITION BY RANGE(log_date)
  6. (
  7. PARTITION M202001 VALUES LESS THAN(TO_DATE('2020/02/01','YYYY/MM/DD'))
  8. , PARTITION M202002 VALUES LESS THAN(TO_DATE('2020/03/01','YYYY/MM/DD'))
  9. , PARTITION M202003 VALUES LESS THAN(TO_DATE('2020/04/01','YYYY/MM/DD'))
  10. , PARTITION M202004 VALUES LESS THAN(TO_DATE('2020/05/01','YYYY/MM/DD'))
  11. , PARTITION M202005 VALUES LESS THAN(TO_DATE('2020/06/01','YYYY/MM/DD'))
  12. , PARTITION MMAX VALUES LESS THAN (MAXVALUE)
  13. );
  14. Query OK, 0 rows affected (0.08 sec)
  15. obclient> ALTER TABLE t_log_part_by_range TRUNCATE PARTITION M202001, M202002 UPDATE GLOBAL INDEXES;
  16. Query OK, 0 rows affected (0.05 sec)