ALTER

最近更新时间: 2025-02-18 16:02:00

ALTER TABLE

本章介绍ALTER相关用法。ALTER TABLE 更改表的结构。 例如,您可以添加或删除列、创建或销毁索引、更改现有列的类型或重命名列或表本身。 您还可以更改特征,例如用于表或表注释的存储引擎。

但是请注意:线上系统的DDL变更请通过赤兔管理控制台的online-ddl模块进行。

语法如下:

  • 复制
    复制成功
ALTER TABLE tbl_name
    [alter_option [, alter_option] ...]
    [partition_options]

alter_option: {
    table_options
  | ADD [COLUMN] col_name column_definition
        [FIRST | AFTER col_name]
  | ADD [COLUMN] (col_name column_definition,...)
  | ADD {INDEX | KEY} [index_name]
        [index_type] (key_part,...) [index_option] ...
  | ALGORITHM [=] {DEFAULT | INSTANT | INPLACE | COPY}
  | CHANGE [COLUMN] old_col_name new_col_name column_definition
        [FIRST | AFTER col_name]
  | [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]
  | {DISABLE | ENABLE} KEYS
  | DROP [COLUMN] col_name
  | DROP {INDEX | KEY} index_name
  | LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
  | MODIFY [COLUMN] col_name column_definition
        [FIRST | AFTER col_name]
  | ORDER BY col_name [, col_name] ...
}

partition_options:
    partition_option [partition_option] ...

partition_option: {
    ADD PARTITION (partition_definition)
  | DROP PARTITION partition_names
  | TRUNCATE PARTITION {partition_names | ALL}
}

key_part: {col_name [(length)]} [ASC | DESC]

index_type:
    USING {BTREE}

index_option: {
index_type | COMMENT 'string'
}

table_options:
    table_option [[,] table_option] ...

table_option: {AUTO_INCREMENT [=] value
  | [DEFAULT] CHARACTER SET [=] charset_name
  | [DEFAULT] COLLATE [=] collation_name
  | COMMENT [=] 'string'
  | COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'}
  | ENGINE [=] engine_name
  | KEY_BLOCK_SIZE [=] value
  | ROW_FORMAT [=] {DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT}
  | STATS_AUTO_RECALC [=] {DEFAULT | 0 | 1}
  | STATS_PERSISTENT [=] {DEFAULT | 0 | 1}
  | STATS_SAMPLE_PAGES [=] value)
}

注意:

  • 要使用 ALTER TABLE ,你需要 ALTER , CREATE 和 INSERT 权限。
  • 不支持改变shardkey类型、删除shardkey的操作
  • 一级分区,语法和单表一样,只能改变db上表结构,不能改变数据分布方式。
  • 二级分区,支持添加和删除分区,语法和单表一样,range分区只能向后追加。

示例:

  • 复制
    复制成功
--创建一级hash分区表
DROP TABLE IF EXISTS sbtest1;
CREATE TABLE `sbtest1` 
(`k` bigint(20) NOT NULL,
`id` bigint(20) NOT NULL,
`c` char(120)  NOT NULL, 
`pad` char(60) NOT NULL, 
`balance` int(11) NOT NULL, 
`lastModifyTime` datetime,
PRIMARY KEY (`k`,`id`), 
KEY `k_1` (`k`)) 
ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin shardkey=id;

--添加删除索引
alter table sbtest1 add index idx_blc (balance);
alter table sbtest1 drop index idx_blc;

--修改表字段类型
alter table sbtest1 modify column pad varchar(50);

--增加一个新列为第一列
alter table sbtest1 add column col1 INT NOT NULL first;

--增加一个到指定列之后
alter table sbtest1 add column col_after_pad INT NOT NULL after pad;

--修改表增加字段
alter table sbtest1 add column mark varchar(50);

--修改表字段名字
alter table sbtest1 change column k k_new1 bigint(20);

--修改表删除字段
alter table sbtest1 drop column mark;

--重组表
ALTER TABLE sbtest1 ENGINE = InnoDB;

--更改 InnoDB 表以使用压缩行存储格式:
ALTER TABLE sbtest1 ROW_FORMAT = COMPRESSED;

--添加(或更改)表注释:
ALTER TABLE sbtest1 COMMENT = 'New table comment';

示例:

  • 复制
    复制成功
创建二级分区表:
DROP TABLE if exists customers_1;
CREATE TABLE customers_1 (
   first_name VARCHAR(25) primary key,
   last_name VARCHAR(25),
   street_1 VARCHAR(30),
   street_2 VARCHAR(30),
   city_name VARCHAR(15),
   renewal DATE
) shardkey=first_name
PARTITION BY LIST (city_name) (
   PARTITION pRegion_1 VALUES IN('BJ', 'GZ', 'SZ'),
   PARTITION pRegion_2 VALUES IN('SH', 'CD'),
   PARTITION pRegion_3 VALUES IN('GY'),
   PARTITION pRegion_4 VALUES IN('HZ')
);

删除分区:
ALTER TABLE customers_1 drop partition pRegion_4;

增加分区:
ALTER TABLE customers_1 add partition (partition pRegion_4 VALUES IN('TJ'));

截断分区:
ALTER TABLE customers_1 truncate partition pRegion_4;

示例:

  • 复制
    复制成功
创建二级分区表:
DROP TABLE IF EXISTS employees_list_range;
CREATE TABLE `employees_list_range` (
  `id`int NOT NULL,
  `city` varchar(10),
  `fired` DATE NOT NULL DEFAULT '1970.01.01',
  PRIMARY KEY(id,fired)
)
PARTITION BY RANGE (month(fired)) (
  PARTITION p0 VALUES LESS THAN (202106),
  PARTITION p1 VALUES LESS THAN (202107)
)
TDSQL_DISTRIBUTED BY LIST(id) (
  s1 VALUES IN (1,3,5),
  s2 VALUES IN (2,4,6)
);

删除分区:
ALTER TABLE employees_list_range drop partition p1;

增加分区:
ALTER TABLE employees_list_range add partition(partition p2 values less than (202108));

截断分区:
ALTER TABLE employees_list_range truncate partition p0;