首先,建立一個如下所示的表格 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);
新增一個名為 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;
若要保證來源和複本上的順序相同,所有 t1
的欄位都必須在 ORDER BY
子句中參考。
無論使用哪種方法建立和填入具有 AUTO_INCREMENT
欄位的複本,最後一步都是捨棄原始表格,然後重新命名複本
DROP TABLE t1;
ALTER TABLE t2 RENAME t1;