文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  ALTER TABLE 範例

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),同時將名稱從 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)

資料表在最初建立時不一定要參考 tablespace;但是,ALTER TABLE 必須參考 tablespace。

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 欄位,則以下陳述式會產生一個新的資料表 t2,與 t1 相同,但具有 AUTO_INCREMENT 欄位:

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

這假設資料表 t1 具有欄位 col1col2

這組陳述式也會產生一個新的資料表 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;