#### 13.1.9.3 ALTER TABLE 示例

从一张桌子开始`t1`创建如下所示：

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

重命名表`t1`到`t2`：

```
ALTER TABLE t1 RENAME t2;
```

更改列`一种`从[`整数`](integer-types.html)到`TINYINT 不为空`（保持名称相同），并更改列`b`从`字符(10)`到`字符(20)`以及将其重命名为`b`到`c`：

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

添加一个新的[`时间戳`](datetime.html)列名为`d`：

```
ALTER TABLE t2 ADD d TIMESTAMP;
```

在列上添加索引`d`和一个`独特`列索引`一种`：

```
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`作为`非空`因为主键列不能`空值`.

为了[`新开发银行`](mysql-cluster.html)表，也可以更改用于表或列的存储类型。例如，考虑一个[`新开发银行`](mysql-cluster.html)创建的表如下所示：

```
mysql> CREATE TABLE t1 (c1 INT) TABLESPACE ts_1 ENGINE NDB;
Query OK, 0 rows affected (1.27 sec)
```

要将此表转换为基于磁盘的存储，您可以使用以下命令[`更改表`](alter-table.html)陈述：

```
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=latin1
1 row in set (0.01 sec)
```

最初创建表时没有必要引用表空间；但是，表空间必须由[`更改表`](alter-table.html)：

```
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=latin1
1 row in set (0.01 sec)
```

要更改单个列的存储类型，您可以使用`ALTER TABLE ...修改[列]`.例如，假设您创建一个包含两列的 NDB Cluster 磁盘数据表，使用此[`创建表`](create-table.html)陈述：

```
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
```

您可以使用以下方法将内存中的列变成基于磁盘的列`存储磁盘`以类似的方式。

柱子`c1`使用基于磁盘的存储，因为这是表的默认值（由表级别确定`存储磁盘`条款中的[`创建表`](create-table.html)陈述）。然而，列`c2`使用内存存储，可以在 SHOW 的输出中看到[`创建表`](create-table.html)：

```
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=latin1
1 row in set (0.02 sec)
```

当您添加一个`自动递增`列，列值自动填充序列号。为了`MyISAM`表，您可以通过执行设置第一个序列号`SET INSERT_ID=*`价值`*`前[`更改表`](alter-table.html)或通过使用`AUTO_INCREMENT=*`价值`*`表选项。

和`MyISAM`表，如果你不改变`自动递增`列，序号不受影响。如果你放下一个`自动递增`列，然后添加另一个`自动递增`列，数字从 1 开始重新排序。

使用复制时，添加一个`自动递增`表的列可能不会在副本和源上产生相同的行顺序。发生这种情况是因为行编号的顺序取决于用于表的特定存储引擎以及插入行的顺序。如果在源和副本上具有相同的顺序很重要，则必须在分配之前对行进行排序`自动递增`数字。假设您要添加一个`自动递增`列到表`t1`，以下语句生成一个新表`t2`相同`t1`但有一个`自动递增`柱子：

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

这假设表`t1`有列`col1`和`col2`.

这组语句还生成了一个新表`t2`相同`t1`，加上一个`自动递增`柱子：

```
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;
```

重要的

为了保证源和副本的顺序相同，*全部*列`t1`必须在`订购方式`条款。

无论使用何种方法创建和填充具有`自动递增`列，最后一步是删除原始表，然后重命名副本：

```
DROP TABLE t1;
ALTER TABLE t2 RENAME t1;
```
