- 以使用ALTER TABLE语句来更改现有表的结构。 ALTER TABLE语句可用来添加列,删除列,更改列的数据类型,添加主键,重命名表等等
- 使用ALTER TABLE语句需要对该 table 具有ALTER,CREATE和INSERT的权限
- 单个ALTER TABLE语句中允许多个ADD,ALTER,DROP和CHANGE子句,并用逗号分隔
语法
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 有用的选项。
使用FIRST或LAST的值可将插入内容移到第一个或最后一个 table,或使用NO的值可防止插入
|
KEY_BLOCK_SIZE
|
value
|
对于MyISAM个
table,KEY_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会告诉存储引擎仅打包长CHAR,VARCHAR,BINARY或VARBINARY列。
如果不使用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 THAN或VALUES 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 < 10或WHERE 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 THAN与PARTITION BY LIST结合使用
|
LIST COLUMNS(column_list)
|
LIST上的此变体使用多个列上的比较条件(即具有WHERE
a = 5 AND b = 5或WHERE 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子句来指示。可以通过HASH或KEY进行分区。这些都可以是LINEAR。这些工作方式与先前针对等效分区类型所述的方式相同。 (无法通过LIST或RANGE进行子分区.)
可以使用SUBPARTITIONS关键字后跟一个整数值来指示子分区的数量
子句
|
描述
|
[LINEAR] HASH(expr)
|
散列一个或多个列以创建用于放置和定位行的键。 * expr *是使用一个或多个 table 列的
table 达式。这可以是产生单个整数值的任何有效 MySQLtable 达式(包括 MySQL 函数)
您不得将VALUES LESS THAN或VALUES 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
|
分区处理程序为PARTITION和SUBPARTITION接受[STORAGE] ENGINE选项。当前,唯一可以使用此方法的方法是将所有分区或所有子分区设置为同一存储引擎,并且尝试为同一 table 中的分区或子分区设置不同的存储引擎将产生错误
|
COMMENT
|
可选的COMMENT子句可用于指定描述分区的字符串
|
DATA | INDEX
DIRECTORY
|
DATA
DIRECTORY和INDEX DIRECTORY可用于指示目录,该分区的数据和索引将分别存储在该目录中。 data_dir和index_dir都必须是绝对系统路径名
从 MySQL 5.7.17 开始,您必须具有FILE特权才能使用DATA
DIRECTORY或INDEX DIRECTORY分区选项
|
MAX_ROWS
|
指定要存储在分区中的最大行数
|
MIN_ROWS
|
指定要存储在分区中的最小行数
|
TABLESPACE
|
可用于为分区指定 table 空间。受
NDB 群集支持。对于InnoDB个
table,可以通过指定 TABLESPACE``来为分区指定每 table 文件
table 空间。所有分区必须属于同一存储引擎
|
subpartition_definition
|
分区定义可以选择包含一个或多个* subpartition_definition 子句。每一个都至少由SUBPARTITION name组成,其中 name *是该子分区的标识符。除了用SUBPARTITION替换PARTITION关键字之外,子分区定义的语法与分区定义的语法相同。
子分区必须由HASH或KEY完成,并且只能在RANGE或LIST分区上进行
|
|
|
修改表名
- 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>