从这里所示的表 t1
开始
CREATE TABLE t1 (a INTEGER, b CHAR(10));
将表从 t1
重命名为 t2
ALTER TABLE t1 RENAME t2;
将列 a
从 INTEGER
更改为 TINYINT NOT NULL
(名称保持不变),并将列 b
从 CHAR(10)
更改为 CHAR(20)
并将其重命名为 c
ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
添加一个名为 d
的新 TIMESTAMP
列
ALTER TABLE t2 ADD d TIMESTAMP;
在列 d
上添加索引,并在列 a
上添加 UNIQUE
索引
ALTER TABLE t2 ADD INDEX (d), ADD UNIQUE (a);
删除列 c
ALTER TABLE t2 DROP COLUMN c;
添加一个名为 c
的新 AUTO_INCREMENT
整数列
ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (c);
我们对 c
(作为 PRIMARY KEY
)进行索引,因为 AUTO_INCREMENT
列必须进行索引,并且我们将 c
声明为 NOT NULL
,因为主键列不能为 NULL
。
对于 NDB
表,也可以更改用于表或列的存储类型。例如,考虑以下示例,其中创建了一个 NDB
表
mysql> CREATE TABLE t1 (c1 INT) TABLESPACE ts_1 ENGINE NDB;
Query OK, 0 rows affected (1.27 sec)
要将此表转换为磁盘存储,可以使用以下 ALTER TABLE
语句
mysql> ALTER TABLE t1 TABLESPACE ts_1 STORAGE DISK;
Query OK, 0 rows affected (2.99 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`c1` int(11) DEFAULT NULL
) /*!50100 TABLESPACE ts_1 STORAGE DISK */
ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.01 sec)
表空间在创建表时不必被引用;但是,表空间必须由 ALTER TABLE
语句引用。
mysql> CREATE TABLE t2 (c1 INT) ts_1 ENGINE NDB;
Query OK, 0 rows affected (1.00 sec)
mysql> ALTER TABLE t2 STORAGE DISK;
ERROR 1005 (HY000): Can't create table 'c.#sql-1750_3' (errno: 140)
mysql> ALTER TABLE t2 TABLESPACE ts_1 STORAGE DISK;
Query OK, 0 rows affected (3.42 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE t2\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t2` (
`c1` int(11) DEFAULT NULL
) /*!50100 TABLESPACE ts_1 STORAGE DISK */
ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.01 sec)
要更改单个列的存储类型,可以使用 ALTER TABLE ... MODIFY [COLUMN]
。例如,假设使用以下 CREATE TABLE
语句创建一个具有两个列的 NDB Cluster 磁盘数据表
mysql> CREATE TABLE t3 (c1 INT, c2 INT)
-> TABLESPACE ts_1 STORAGE DISK ENGINE NDB;
Query OK, 0 rows affected (1.34 sec)
要将列 c2
从磁盘存储更改为内存存储,在 ALTER TABLE
语句中使用的列定义中包含 STORAGE MEMORY
子句,如下所示
mysql> ALTER TABLE t3 MODIFY c2 INT STORAGE MEMORY;
Query OK, 0 rows affected (3.14 sec)
Records: 0 Duplicates: 0 Warnings: 0
可以通过类似的方式使用 STORAGE DISK
将内存中的列更改为磁盘存储列。
列 c1
使用磁盘存储,因为这是表的默认设置(由 CREATE TABLE
语句中的表级 STORAGE DISK
子句确定)。但是,列 c2
使用内存存储,这可以从以下 SHOW CREATE TABLE
语句的输出结果中看到
mysql> SHOW CREATE TABLE t3\G
*************************** 1. row ***************************
Table: t3
Create Table: CREATE TABLE `t3` (
`c1` int(11) DEFAULT NULL,
`c2` int(11) /*!50120 STORAGE MEMORY */ DEFAULT NULL
) /*!50100 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.02 sec)
添加 AUTO_INCREMENT
列时,列值将自动填充序列号。对于 MyISAM
表,可以通过在执行 ALTER TABLE
之前执行 SET INSERT_ID=
或使用 value
AUTO_INCREMENT=
表选项来设置第一个序列号。value
对于 MyISAM
表,如果不更改 AUTO_INCREMENT
列,则序列号不会受到影响。如果删除 AUTO_INCREMENT
列,然后添加另一个 AUTO_INCREMENT
列,则编号将从 1 开始重新排序。
在使用复制时,向表中添加 AUTO_INCREMENT
列可能不会在副本和源上产生相同的行排序。这是因为行的编号顺序取决于用于表的特定存储引擎以及插入行的顺序。如果必须在源和副本上保持相同的顺序,则必须在分配 AUTO_INCREMENT
编号之前对行进行排序。假设要向表 t1
添加 AUTO_INCREMENT
列,以下语句将生成一个与 t1
相同但具有 AUTO_INCREMENT
列的新表 t2
CREATE TABLE t2 (id INT AUTO_INCREMENT PRIMARY KEY)
SELECT * FROM t1 ORDER BY col1, col2;
假设表 t1
具有列 col1
和 col2
。
这组语句还将生成一个与 t1
相同的新表 t2
,并添加了一个 AUTO_INCREMENT
列
CREATE TABLE t2 LIKE t1;
ALTER TABLE t2 ADD id INT AUTO_INCREMENT PRIMARY KEY;
INSERT INTO t2 SELECT * FROM t1 ORDER BY col1, col2;
为了保证源和副本上的排序相同,必须在 ORDER BY
子句中引用 t1
的 所有 列。
无论使用哪种方法来创建和填充包含 AUTO_INCREMENT
列的副本,最后一步都是删除原始表,然后重命名副本。
DROP TABLE t1;
ALTER TABLE t2 RENAME t1;