从创建的表开始,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)
为以及将其重命名
b
为c
:
ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
添加一个TIMESTAMP
名为的新列d
:
ALTER TABLE t2 ADD d TIMESTAMP;
在 columnd
和
column 上添加UNIQUE
索引a
:
ALTER TABLE t2 ADD INDEX (d), ADD UNIQUE (a);
删除列c
:
ALTER TABLE t2 DROP COLUMN c;
添加一个AUTO_INCREMENT
名为 的新整数列c
:
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=latin1
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=latin1
1 row in set (0.01 sec)
要更改单个列的存储类型,您可以使用
ALTER TABLE ... MODIFY [COLUMN]
. 例如,假设您使用以下CREATE TABLE
语句创建一个包含两列的 NDB Cluster Disk Data 表:
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
使用基于磁盘的存储,因为这是表的默认设置(由语句中的表级
STORAGE DISK
子句
确定CREATE TABLE
)。但是,列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=latin1
1 row in set (0.02 sec)
添加AUTO_INCREMENT
列时,列值会自动填充序列号。对于
表格,您可以通过执行之前
或使用
表格选项
MyISAM
来设置第一个序列号。SET
INSERT_ID=
value
ALTER TABLE
AUTO_INCREMENT=
value
对于MyISAM
表,如果您不更改
AUTO_INCREMENT
列,则序号不受影响。如果删除一AUTO_INCREMENT
列然后添加另一AUTO_INCREMENT
列,数字将从 1 开始重新排序。
使用复制时,向
AUTO_INCREMENT
表中添加列可能不会在副本和源上产生相同的行排序。发生这种情况是因为行的编号顺序取决于用于表的特定存储引擎和插入行的顺序。如果源和副本上的顺序相同很重要,则必须在分配
AUTO_INCREMENT
数字之前对行进行排序。假设您要向AUTO_INCREMENT
表中添加一列
t1
,以下语句会生成一个与该表t2
相同t1
但包含一AUTO_INCREMENT
列的新表:
CREATE TABLE t2 (id INT AUTO_INCREMENT PRIMARY KEY)
SELECT * FROM t1 ORDER BY col1, col2;
这假定该表t1
具有列
col1
和col2
。
这组语句还生成一个
与 添加一列t2
相同的新表:
t1
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;
为保证源和副本的顺序相同,
子句
中必须引用所有列。t1
ORDER BY
无论使用何种方法创建和填充具有该AUTO_INCREMENT
列的副本,最后一步是删除原始表,然后重命名副本:
DROP TABLE t1;
ALTER TABLE t2 RENAME t1;