文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手冊頁 (TGZ) - 258.5Kb
手冊頁 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  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 欄位必須編制索引,並且我們宣告 cNOT 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 具有欄位 col1col2

這組陳述式也會產生一個與 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;