Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


15.1.9.3 ALTER TABLE 示例

以以下方式创建一个表t1

CREATE TABLE t1 (a INTEGER, b CHAR(10));

将表从t1重命名为t2:

ALTER TABLE t1 RENAME t2;

将列aINTEGER更改为TINYINT NOT NULL(名称不变),并将列bCHAR(10)更改为CHAR(20),同时重命名为c:

ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);

添加一个名为dTIMESTAMP列:

ALTER TABLE t2 ADD d TIMESTAMP;

在列d上添加索引,并在列a上添加唯一索引:

ALTER TABLE t2 ADD INDEX (d), ADD UNIQUE (a);

删除列c:

ALTER TABLE t2 DROP COLUMN c;

添加一个名为c的自动递增整数列:

ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
  ADD PRIMARY KEY (c);

我们对c进行索引(作为主键)因为自动递增列必须索引,我们将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]。例如,假设您创建了一个NDB集群磁盘数据表,具有两个列,使用以下CREATE TABLE语句:

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列添加到新表t2,以下语句创建一个与t1相同的表t2但具有AUTO_INCREMENT列:

CREATE TABLE t2 (id INT AUTO_INCREMENT PRIMARY KEY)
SELECT * FROM t1 ORDER BY col1, col2;

这个假设表t1有列col1col2

这个语句集也可以创建一个与t1相同的表t2AUTO_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;
Important

为了在源服务器和副本中保持相同的顺序,必须在ORDER BY子句中引用t1中的所有列。

无论使用哪种方法创建和填充具有AUTO_INCREMENT列的副本,最后一步是删除原始表并将副本重命名:

DROP TABLE t1;
ALTER TABLE t2 RENAME t1;