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


MySQL 8.4 參考手冊  /  ...  /  ALTER TABLE 和產生式資料行

15.1.9.2 ALTER TABLE 和產生式資料行

針對產生的欄位,允許的 ALTER TABLE 操作包括 ADDMODIFYCHANGE

  • 可以新增產生的欄位。

    CREATE TABLE t1 (c1 INT);
    ALTER TABLE t1 ADD COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED;
  • 可以修改產生的欄位的資料類型和表達式。

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) STORED);
    ALTER TABLE t1 MODIFY COLUMN c2 TINYINT GENERATED ALWAYS AS (c1 + 5) STORED;
  • 如果沒有其他欄位參照產生的欄位,則可以重新命名或刪除這些欄位。

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) STORED);
    ALTER TABLE t1 CHANGE c2 c3 INT GENERATED ALWAYS AS (c1 + 1) STORED;
    ALTER TABLE t1 DROP COLUMN c3;
  • 虛擬產生的欄位不能變更為儲存的產生的欄位,反之亦然。若要解決這個問題,請先刪除欄位,然後使用新的定義新增它。

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL);
    ALTER TABLE t1 DROP COLUMN c2;
    ALTER TABLE t1 ADD COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED;
  • 非產生的欄位可以變更為儲存的,但不能變更為虛擬產生的欄位。

    CREATE TABLE t1 (c1 INT, c2 INT);
    ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED;
  • 儲存的(但非虛擬的)產生的欄位可以變更為非產生的欄位。儲存的產生值會成為非產生欄位的值。

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) STORED);
    ALTER TABLE t1 MODIFY COLUMN c2 INT;
  • ADD COLUMN 對於儲存的欄位不是就地操作(不使用暫存表格完成),因為表達式必須由伺服器評估。對於儲存的欄位,索引變更會就地完成,而表達式變更則不會就地完成。欄位註解的變更會就地完成。

  • 對於未分割的表格,ADD COLUMNDROP COLUMN 對於虛擬欄位是就地操作。但是,新增或刪除虛擬欄位不能與其他 ALTER TABLE 操作結合就地執行。

    對於分割的表格,ADD COLUMNDROP COLUMN 對於虛擬欄位不是就地操作。

  • InnoDB 支援虛擬產生的欄位上的次要索引。在虛擬產生的欄位上新增或刪除次要索引是就地操作。有關更多資訊,請參閱第 15.1.20.9 節「次要索引和產生的欄位」

  • 當將 VIRTUAL 產生的欄位新增至表格或修改時,無法保證產生的欄位表達式所計算的資料不會超出該欄位的範圍。這可能會導致傳回不一致的資料並導致語句意外失敗。為了允許控制是否對此類欄位進行驗證,ALTER TABLE 支援 WITHOUT VALIDATIONWITH VALIDATION 子句。

    • 使用 WITHOUT VALIDATION(如果未指定任何子句,則為預設值),會執行就地操作(如果可能),不會檢查資料完整性,並且語句會更快完成。但是,如果數值超出範圍,後續從表格讀取資料時可能會報告欄位的警告或錯誤。

    • 使用 WITH VALIDATIONALTER TABLE 會複製表格。如果發生超出範圍或其他任何錯誤,語句將失敗。由於執行了表格複製,因此語句需要更長的時間。

    WITHOUT VALIDATIONWITH VALIDATION 僅允許與 ADD COLUMNCHANGE COLUMNMODIFY COLUMN 操作搭配使用。否則,會發生 ER_WRONG_USAGE 錯誤。

  • 如果表達式評估導致截斷或向函式提供不正確的輸入,則 ALTER TABLE 語句會終止並出現錯誤,且 DDL 操作會被拒絕。

  • 變更欄位 col_name 預設值的 ALTER TABLE 語句也可能會變更使用 col_name 參照該欄位的產生欄位表達式的值,這可能會變更使用 DEFAULT(col_name) 參照該欄位的產生欄位表達式的值。因此,如果任何產生的欄位表達式使用 DEFAULT(),則變更欄位定義的 ALTER TABLE 操作會導致表格重建。