修改数据表(ALTER TABLE)

Exisi 2023-01-29 14:51:06
Categories: Tags:
  • 以使用ALTER TABLE语句来更改现有表的结构。 ALTER TABLE语句可用来添加列,删除列,更改列的数据类型,添加主键,重命名表等等

 

  • 使用ALTER TABLE语句需要对该 table 具有ALTERCREATEINSERT的权限

 

  • 单个ALTER TABLE语句中允许多个ADDALTERDROPCHANGE子句,并用逗号分隔

语法

ALTER TABLE tbl_name

    [alter_option [, alter_option] ...]

    [partition_options] ;

 

参数

描述

[alter_option]

参数

描述

table_options

可选参数:

参数

描述

AUTO_INCREMENT

value

字段自增

AVG_ROW_LENGTH

value

table 的平均行长的近似值。您仅需要为具有可变大小行的大型 table 设置此选项

[DEFAULT] CHARACTER SET

charset_name

设置默认字符集

[DEFAULT] COLLATE

collation_name

设置默认校验规则

CHECKSUM

0 | 1

是否对表中的数据进行逐行较验和计算

COMMENT

'string'

添加注释,最多 2048 个字符

COMPRESSION

'ZLIB' | 'LZ4' | 'NONE'

用于InnoDB table 的页面级压缩的压缩算法

CONNECTION

'connect_string'

FEDERATEDtable 的连接字符串

{DATA | INDEX} DIRECTORY

'absolute path to directory'

指定数据文件存储路径

创建MyISAMtable 时,它们指定分别放置MyISAMtable 的数据文件和索引文件的位置。

InnoDBtable 不同,MySQL 不会创建与数据库名称相对应的子目录。在指定的目录中创建文件。

DELAY_KEY_WRITE

0 | 1

是否在表关闭之前,将对表的update操作指跟新数据到磁盘,而不更新索引到磁盘,把对索引的更改记录在内存

如果要在关闭 table 之前延迟 table 的键更新,请将其设置为 1

ENCRYPTION

'Y' | 'N'

是否加密,

ENCRYPTION选项设置为'Y'以对在file-per-tabletable 空间中创建的InnoDBtable 启用页面级数据加密。选项值不区分大小写。

InnoDBtable 空间加密功能引入了ENCRYPTION选项

ENGINE

engine_name

存储引擎

INSERT_METHOD

NO | FIRST | LAST

表的插入的方式

如果要将数据插入MERGE table,则必须用INSERT_METHOD指定应将行插入到的 table

INSERT_METHOD是仅对MERGEtable 有用的选项。

使用FIRSTLAST的值可将插入内容移到第一个或最后一个 table,或使用NO的值可防止插入

KEY_BLOCK_SIZE

value

对于MyISAM tableKEY_BLOCK_SIZE(可选)以字节为单位指定用于索引键块的大小。该值被视为提示;如有必要,可以使用其他大小。为单个索引定义指定的KEY_BLOCK_SIZE值将覆盖 table KEY_BLOCK_SIZE的值。

MAX_ROWS

value

计划在 table 中存储的最大行数

MIN_ROWS

value

计划在 table 中存储的最小行数

PACK_KEYS

0 | 1 | DEFAULT

仅对MyISAM table 生效。

如果要使用较小的索引,请将此选项设置为 1这通常会使更新速度变慢,读取速度也会加快。

将选项设置为 0 将禁用所有键打包。

将其设置为DEFAULT会告诉存储引擎仅打包长CHARVARCHARBINARYVARBINARY列。

如果不使用PACK_KEYS,则默认值为打包字符串,但不打包数字。

如果您使用PACK_KEYS=1,数字也会被打包

ROW_FORMAT

DEFAULT

DYNAMIC

FIXED

COMPRESSED

REDUNDANT

COMPACT

显式定义表的行格式

STATS_AUTO_RECALC

DEFAULT | 0 | 1

指定是否自动重新计算持久统计信息。值 DEFAULT 导致 table 的持久统计设置由 innodb_stats_auto_recalc 设置确定。

1 会导致在 10% 的表数据发生更改时重新计算统计信息。

STATS_PERSISTENT

DEFAULT | 0 | 1

指定是否为 InnoDB 表启用持久统计。

DEFAULT 导致表的持久统计信息设置由 innodb_stats_persistent 设置确定。

1 启用表的持久统计信息,而值 0 禁用该功能。

STATS_SAMPLE_PAGES

value

指定在为索引列计算基数和其他统计信息时要采样的索引页数

TABLESPACE  

 

 

 

 

 

(STORAGE)

tablespace_name

 

 

 

 

 

DISK | MEMORY

可用于在现有的常规 table 空间,每 table 文件 table 空间或系统 table 空间中创建 table

指定的常规 table 空间在使用TABLESPACE子句之前必须存在

 

STORAGE table 分配给 NDB 群集磁盘数据 table 空间,STORAGE 选项仅与NDBtable 一起使用

UNION

(tbl_name[,tbl_name]...)

用于访问一个相同的MyISAMtable 的集合。仅适用于合并多个 table

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] ...

添加普通/常规索引

参数

描述

key_part

col_name [(length)] [ASC | DESC]

index_type

USING {BTREE | HASH}

ADD {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name]

        (key_part,...) [index_option] ...

添加全文/空间/普通/常规索引

ADD [CONSTRAINT [symbol]] PRIMARY KEY

        [index_type] (key_part,...)

        [index_option] ...

添加主键

参数

描述

key_part

col_name [(length)] [ASC | DESC]

index_type

USING {BTREE | HASH}

[index_option]

参数

描述

KEY_BLOCK_SIZE

value

键块大小

index_type

 

索引类型

WITH PARSER parser_name

 

使用解析器

COMMENT

'string'

注释

ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]

        [index_name] [index_type] (key_part,...)

        [index_option] ...

添加唯一索引

ADD [CONSTRAINT [symbol]] FOREIGN KEY

        [index_name] (col_name,...)

        reference_definition

添加外键

ADD [CONSTRAINT [symbol]]

CHECK (expr) [[NOT] ENFORCED]

MySQL 8.0.16开始,ALTER TABLE允许添加,删除或更改现有表的约束

DROP {CHECK | CONSTRAINT} symbol

删除名为 symbol 的现有约束

ALTER {CHECK | CONSTRAINT} symbol [NOT] ENFORCED

是否强制更改名为 symbol 的现有约束

ALGORITHM [=] {DEFAULT | INSTANT | INPLACE | COPY}

设置算法,ALGORITHM子句是可选的

COPY:对原始 table 的副本执行操作,并将 table 数据从原始 table 逐行复制到新 table。不允许并发 DML

 

INPLACE:操作避免复制 table 数据,但可以在适当位置重建 table。在操作的准备和执行阶段可以简短地获取 table 上的独占元数据锁定。通常,支持并发 DML

 

INSTANT:操作仅修改数据字典中的元数据。在准备和执行过程中,不会对表进行独占元数据锁定,并且表数据不受影响,从而使操作即时进行。允许并发 DML。(在 MySQL 8.0.12 中引入)

 

如果省略ALGORITHM子句,则 MySQL 使用ALGORITHM=INPLACEtable 示存储引擎和使用ALTER TABLE子句来支持它。否则,使用ALGORITHM=COPY

ALTER [COLUMN] col_name {SET DEFAULT literal | (expr)}

设置和删除默认的文字(常量)

ALTER [COLUMN] col_name SET {VISIBLE | INVISIBLE}

设置行的可见性

ALTER [COLUMN] col_name DROP DEFAULT

删除默认值

ALTER INDEX index_name {VISIBLE | INVISIBLE}

修改索引可见性

CHANGE [COLUMN] old_col_name new_col_name column_definition

        [FIRST | AFTER col_name]

修改列的属性,名称、定义、数据插入模式

MODIFY [COLUMN] col_name column_definition

        [FIRST | AFTER col_name]

修改列的属性,定义、数据插入模式

[DEFAULT] CHARACTER SET [=] charset_name

[COLLATE [=] collation_name]

设置字符集和校验规则

CONVERT TO CHARACTER

SET charset_name [COLLATE collation_name]

将原有字符集转换为成其他字符集和校验规则

{DISABLE | ENABLE} KEYS

关闭或开启索引

{DISCARD | IMPORT} TABLESPACE

删除表空间,会引起表重建

DROP [COLUMN] col_name

删除列

DROP {INDEX | KEY} index_name

删除普通/常规索引

DROP PRIMARY KEY

删除主键

DROP FOREIGN KEY fk_symbol

删除外键

FORCE

强制索引

LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}

锁定模式,用于设置并发写入级别

ORDER BY col_name [, col_name] ...

按照数据表中的特定行排序

RENAME COLUMN old_col_name TO new_col_name

重命名列字段

RENAME {INDEX | KEY} old_index_name TO new_index_name

重命名普通/常规索引

RENAME [TO | AS] new_tbl_name

重命名数据表

{WITHOUT | WITH} VALIDATION}

添加或移除加密插件

[partition_option]

可选子句:

子句

描述

ADD PARTITION (partition_definition)

增加分区

DROP PARTITION partition_names

删除分区

DISCARD PARTITION {partition_names | ALL} TABLESPACE

表传输空间

IMPORT PARTITION {partition_names | ALL} TABLESPACE

丢弃表空间的分区

TRUNCATE PARTITION {partition_names | ALL}

清空分区

COALESCE PARTITION number

合并分区

REORGANIZE PARTITION partition_names INTO (partition_definitions)

更改分区属性

EXCHANGE PARTITION partition_name WITH TABLE tbl_name

[{WITH | WITHOUT VALIDATION]

交换表分区

ANALYZE PARTITION {partition_names | ALL}

分析分区

CHECK PARTITION {partition_names | ALL}

检查分区

OPTIMIZE PARTITION {partition_names | ALL}

优化分区

REBUILD PARTITION {partition_names | ALL}

重建分区

REPAIR PARTITION {partition_names | ALL}

修复分区

REMOVE PARTITIONING

移除分区

[partition_options]

可用于控制用CREATE TABLE创建的 table 的分区

参数

描述

PARTITION BY

 

包含用于确定分区的函数;该函数返回一个整数值,范围是 1 num ,其中 num *是分区数。

(一个 table 可能包含的用户定义的分区的最大数量为 1024;该分区的最大数量包括了子分区的数

子句

描述

[LINEAR] HASH(expr)

散列一个或多个列以创建用于放置和定位行的键。 * expr *是使用一个或多个 table 列的 table 达式。这可以是产生单个整数值的任何有效 MySQLtable 达式(包括 MySQL 函数)

 

您不得将VALUES LESS THANVALUES IN子句与PARTITION BY HASH一起使用。

PARTITION BY HASH使用* expr *的余数除以分区数(即模数)

[LINEAR] KEY(column_list)

这类似于HASH,除了 MySQL 提供散列功能以保证均匀的数据分布。 * column_list *参数只是一个 1 或多个 table 列的列 table(最多 16 )

 

对于按键分区的 table,可以通过使用LINEAR关键字来采用线性分区。这与由HASH分区的 table 具有相同的效果。也就是说,使用&运算符而不是模数来找到分区号

[LINEAR] RANGE(expr)

在这种情况下,* expr *使用一组VALUES LESS THAN运算符显示值的范围。使用范围分区时,必须使用VALUES LESS THAN定义至少一个分区。您不能将VALUES IN与范围分区一起使用

 

对于由RANGE分区的 table,必须将VALUES LESS THAN与整数 Literals 值或计算结果为单个整数值的 table 达式一起使用

RANGE COLUMNS(column_list)

RANGE上的此变体有助于使用多个列上的范围条件(即具有诸如WHERE a = 1 AND b < 10WHERE a = 1 AND b = 10 AND c < 10之类的条件)对查询进行分区修剪。它使您可以通过使用COLUMNS子句中的列列 table 和每个PARTITION ... VALUES LESS THAN (value_list)分区定义子句中的一组列值来指定多列中的值范围。 (在最简单的情况下,此集合由单个列组成.)* column_list value_list *中可以引用的最大列数为 16.

 

COLUMNS子句中使用的* column_list *只能包含列名;列 table 中的每一列必须是以下 MySQL 数据类型之一

[LINEAR] LIST(expr)

基于具有有限的可能值集(例如 State 或国家/locale 代码) table 列分配分区时,此功能很有用。在这种情况下,可以将与某个 State 或国家/locale 有关的所有行分配给单个分区,或者可以为某个 State 或国家/locale 的某个组保留一个分区。它类似于RANGE,不同之处在于仅VALUES IN可以用于指定每个分区的允许值

 

您不能将VALUES LESS THANPARTITION BY LIST结合使用

LIST COLUMNS(column_list)

LIST上的此变体使用多个列上的比较条件(即具有WHERE a = 5 AND b = 5WHERE a = 1 AND b = 10 AND c = 5之类的条件)来简化查询的分区修剪。它使您可以通过使用COLUMNS子句中的列列 table 和每个PARTITION ... VALUES IN (value_list)分区定义子句中的一组列值来指定多列中的值。

 

关于LIST COLUMNS(column_list)中使用的列列 table VALUES IN(value_list)中使用的值列 table 的数据类型的规则分别与RANGE COLUMNS(column_list)VALUES LESS THAN(value_list)中使用的列列 table 的数据类型相同,除了VALUES IN子句MAXVALUE不允许,您可以使用NULL

 

PARTITION BY LIST一起使用时,与PARTITION BY LIST COLUMNS一起用于VALUES IN的值列 table 之间有一个重要区别。与PARTITION BY LIST COLUMNS一起使用时,VALUES IN子句中的每个元素都必须是一组*列值;每个集合中的值数必须与COLUMNS子句中使用的列数相同,并且这些值的数据类型必须与列的数据类型匹配(并以相同的 Sequences 出现)。在最简单的情况下,集合由单个列组成。 * column_list 和组成 value_list *的元素中可以使用的最大列数为 16.

[PARTITIONS num]

可以选择使用PARTITIONS num子句指定分区的数量,其中* num 是分区的数量。如果此子句和*都使用了任何PARTITION子句,则num *必须等于使用PARTITION子句声明的任何分区的总数

[SUBPARTITION BY]

分区可以可选地划分为多个子分区。这可以通过使用可选的SUBPARTITION BY子句来指示。可以通过HASHKEY进行分区。这些都可以是LINEAR。这些工作方式与先前针对等效分区类型所述的方式相同。 (无法通过LISTRANGE进行子分区.)

 

可以使用SUBPARTITIONS关键字后跟一个整数值来指示子分区的数量

 

子句

描述

[LINEAR] HASH(expr)

散列一个或多个列以创建用于放置和定位行的键。 * expr *是使用一个或多个 table 列的 table 达式。这可以是产生单个整数值的任何有效 MySQLtable 达式(包括 MySQL 函数)

 

您不得将VALUES LESS THANVALUES IN子句与PARTITION BY HASH一起使用。

PARTITION BY HASH使用* expr *的余数除以分区数(即模数)

[LINEAR] KEY(column_list)

这类似于HASH,除了 MySQL 提供散列功能以保证均匀的数据分布。 * column_list *参数只是一个 1 或多个 table 列的列 table(最多 16 )

 

对于按键分区的 table,可以通过使用LINEAR关键字来采用线性分区。这与由HASH分区的 table 具有相同的效果。也就是说,使用&运算符而不是模数来找到分区号

[(partition_definition [, partition_definition] ...)]

每个分区可以使用* partition_definition *子句单独定义

子句

描述

PARTITION partition_name

指定分区的逻辑名

VALUES

对于范围分区,每个分区必须包含VALUES LESS THAN子句;对于列 table 分区,必须为每个分区指定一个VALUES IN子句。这用于确定哪些行要存储在此分区中。

[STORAGE] ENGINE

分区处理程序为PARTITIONSUBPARTITION接受[STORAGE] ENGINE选项。当前,唯一可以使用此方法的方法是将所有分区或所有子分区设置为同一存储引擎,并且尝试为同一 table 中的分区或子分区设置不同的存储引擎将产生错误

COMMENT

可选的COMMENT子句可用于指定描述分区的字符串

DATA | INDEX DIRECTORY

DATA DIRECTORYINDEX DIRECTORY可用于指示目录,该分区的数据和索引将分别存储在该目录中。 data_dirindex_dir都必须是绝对系统路径名

 

MySQL 5.7.17 开始,您必须具有FILE特权才能使用DATA DIRECTORYINDEX DIRECTORY分区选项

MAX_ROWS

指定要存储在分区中的最大行数

MIN_ROWS

指定要存储在分区中的最小行数

TABLESPACE

可用于为分区指定 table 空间。受 NDB 群集支持。对于InnoDB table,可以通过指定 TABLESPACE``来为分区指定每 table 文件 table 空间。所有分区必须属于同一存储引擎

subpartition_definition

分区定义可以选择包含一个或多个* subpartition_definition 子句。每一个都至少由SUBPARTITION name组成,其中 name *是该子分区的标识符。除了用SUBPARTITION替换PARTITION关键字之外,子分区定义的语法与分区定义的语法相同。

 

子分区必须由HASHKEY完成,并且只能在RANGELIST分区上进行

 

 

 

修改表名

  • MySQL 通过 ALTER TABLE … RENAME 语句来实现表名的修改

 

  • 也可以直接 RENAME TABLE … TO 语句

语法

ALTER TABLE <tbl_name>

RENAME [TO | AS] <new_tbl_name> ;

 

参数

描述

<tbl_name>

数据表名

<new_tbl_name>

新数据表名

语法

RENAME TABLE <tbl_name> TO <new_tbl_name> ;

 

参数

描述

<tbl_name>

数据表名

<new_tbl_name>

新数据表名

示例

mysql> ALTER TABLE tb_emp1

    -> RENAME tb_emp2;

 

Query OK, 0 rows affected (0.80 sec)

Records: 0  Duplicates: 0  Warnings: 0

示例

mysql> RENAME TABLE tb_emp1 TO tb_emp2;

 

Query OK, 0 rows affected (0.80 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

 

 

修改表字符集

  • ALTER TABLE … CHARACTER SET 允许更改表的字符集,COLLATE 语句是可选的,如使用请将字符集和校验规则保持一致

语法

ALTER TABLE <tbl_name>

[DEFAULT] CHARACTER SET <charset_name>

[COLLATE <collation_name>] ;

 

参数

描述

<tbl_name>

数据表名

<charset_name>

字符集名

<collation_name>

校验规则

示例

mysql> ALTER TABLE tb_emp1

    -> CHARACTER SET utf8mb4;

 

Query OK, 0 rows affected (0.50 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

 

 

修改表引擎

ALTER TABLE … ENGINE 语句可以更改表的存储引擎

语法

ALTER TABLE <tbl_name>

ENGINE = engine_name ;

示例

mysql> ALTER TABLE tb_emp1

    -> ENGINE = InnoDB;

 

Query OK, 0 rows affected (0.50 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

 

来自 <https://www.docs4dev.com/docs/zh/mysql/5.7/reference/alter-table.html>