針對產生的欄位,允許的 ALTER TABLE
操作包括 ADD
、MODIFY
和 CHANGE
。
可以新增產生的欄位。
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 COLUMN
和DROP COLUMN
對於虛擬欄位是就地操作。但是,新增或刪除虛擬欄位不能與其他ALTER TABLE
操作結合就地執行。對於分割的表格,
ADD COLUMN
和DROP COLUMN
對於虛擬欄位不是就地操作。InnoDB
支援虛擬產生的欄位上的次要索引。在虛擬產生的欄位上新增或刪除次要索引是就地操作。有關更多資訊,請參閱第 15.1.20.9 節「次要索引和產生的欄位」。當將
VIRTUAL
產生的欄位新增至表格或修改時,無法保證產生的欄位表達式所計算的資料不會超出該欄位的範圍。這可能會導致傳回不一致的資料並導致語句意外失敗。為了允許控制是否對此類欄位進行驗證,ALTER TABLE
支援WITHOUT VALIDATION
和WITH VALIDATION
子句。使用
WITHOUT VALIDATION
(如果未指定任何子句,則為預設值),會執行就地操作(如果可能),不會檢查資料完整性,並且語句會更快完成。但是,如果數值超出範圍,後續從表格讀取資料時可能會報告欄位的警告或錯誤。使用
WITH VALIDATION
,ALTER TABLE
會複製表格。如果發生超出範圍或其他任何錯誤,語句將失敗。由於執行了表格複製,因此語句需要更長的時間。
WITHOUT VALIDATION
和WITH VALIDATION
僅允許與ADD COLUMN
、CHANGE COLUMN
和MODIFY COLUMN
操作搭配使用。否則,會發生ER_WRONG_USAGE
錯誤。如果表達式評估導致截斷或向函式提供不正確的輸入,則
ALTER TABLE
語句會終止並出現錯誤,且 DDL 操作會被拒絕。變更欄位
col_name
預設值的ALTER TABLE
語句也可能會變更使用col_name
參照該欄位的產生欄位表達式的值,這可能會變更使用DEFAULT(
參照該欄位的產生欄位表達式的值。因此,如果任何產生的欄位表達式使用col_name
)DEFAULT()
,則變更欄位定義的ALTER TABLE
操作會導致表格重建。