ALTER TABLE語法用于修改表的結構,例如增加列、刪除列、修改列的數據類型、新增表屬性等。本文介紹ALTER TABLE語法在不同引擎中的使用方法和差異。
引擎與版本
ALTER TABLE語法適用于寬表引擎和時序引擎。無版本限制。
注意事項
ALTER TABLE操作不會鎖定表,在執行DDL操作過程中整個表都是可以正常讀寫的。在讀寫過程中,可能會遇到超時報錯或輕微抖動和毛刺,可能是由于以下原因:
DDL操作變更時,每個分片都會先關閉再打開并重新加載元數據,該過程耗時很短,通常在十毫秒至數百毫秒之間。如果在該過程恰好有請求發送至重新打開的分片,則此時請求可能會有輕微抖動或毛刺,建議您在業務低峰期執行DDL變更操作。
所有DDL操作都會在分片完成變更后才會返回執行結果,因此在對規模較大的表執行DDL操作時,由于客戶端超時時間較短,可能會遇到超時報錯,但實際上DDL操作會在服務器上繼續執行直至完成。
語法
alter_table_statement ::= ALTER TABLE table_name alter_table_instruction
alter_table_instruction ::= ADD [COLUMN] column_name type [TAG]
| DROP COLUMN [ IF EXISTS ] column_name
| SET table_options
| COMPACT (idcName)?
差異說明
Lindorm寬表引擎和時序引擎的ALTER TABLE語法差異較大。差異對比請參見下表。
語法要素 | 寬表引擎 | 時序引擎 |
ADD COLUMN | 〇 | 〇 |
COMPACT | 〇 說明 寬表引擎2.3.4及以上版本支持。 | ?? |
DROP COLUMN | 〇 說明 寬表引擎2.6.6及以上版本支持。 | ?? |
SET table_options | 〇 | ?? |
使用說明
ADD COLUMN(新增列)
寬表引擎和時序引擎均支持ADD COLUMN。
新增列有以下規則:
新增的列不能聲明為主鍵。
針對時序引擎,只支持新增標簽列(TAG)和量測值列(FIELD),不支持新增時間戳列。
DROP COLUMN(刪除列)
僅版本為2.6.6及以上版本的寬表引擎支持DROP COLUMN。
如果您無法通過控制臺升級至2.6.6及以上版本,請聯系Lindorm技術支持(釘釘號:s0s3eg3)。
DROP COLUMN操作是異步執行的,ALTER TABLE
語句執行成功后系統會立刻刪除目標列,但列中的數據在系統完成COMPACT
操作后才會被清理。如果您需要加速數據清理進程,可以手動執行FLUSH
和COMPACT
操作。同時,在數據完成清理前,您無法添加同名列。具體操作及說明,請參見常見問題。
SET table_options(設置表屬性)
僅寬表引擎支持SET table_options。
具體的表屬性列表,請參見表屬性。您可以通過SHOW TABLE VARIABLES
語句驗證表屬性是否設置成功,詳細介紹請參見SHOW TABLE VARIABLES。
修改MUTABILITY和CONSISTENCY屬性,有以下兩點注意事項:
創建索引之前,支持修改MUTABILITY和CONSISTENCY。
創建索引之后:
無法修改MUTABILITY。
僅支持將CONSISTENCY的值從
eventual
修改為strong
,但不支持從strong
修改為eventual
。
示例請參見開啟動態列。
COMPACT(強制執行Major Compaction)
僅版本為2.3.4及以上版本的寬表引擎支持Major Compaction。
執行Major Compaction操作,會合并數據文件,清理已刪除或過期的數據,釋放磁盤空間,提高讀寫性能,但Major Compaction操作會占用系統資源。
不指定idcName:
對單可用區實例來說,因為只有一個IDC,是否指定idcName沒有區別。
對多可用區實例來說,有2個IDC,不指定idcName時Major Compaction操作的執行規則如下:
寬表引擎版本低于2.6.4.2:只會對idc1進行Major Compaction。
寬表引擎為2.6.4.2及以上版本:默認對所有的IDC進行Major Compaction。
指定idcName,表示對指定IDC進行Major Compaction。idcName可指定多個,多個idcName之間用半角逗號(,)分隔。
示例請參見執行Major Compaction。
示例
本文提供的示例基于CREATE TABLE文檔的建表示例語句。
CREATE TABLE sensor (
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time BIGINT NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
);
新增列
為表sensor
新增一個列n1
。
ALTER TABLE sensor ADD COLUMN n1 DOUBLE;
刪除列
為表sensor
刪除列n1
。
ALTER TABLE sensor DROP COLUMN IF EXISTS n1;
結果驗證
執行以下語句可以驗證操作結果。
DESCRIBE table sensor;
開啟動態列
開啟sensor
表的動態列。
ALTER TABLE sensor SET DYNAMIC_COLUMNS = 'true';
關于動態列的介紹,請參見動態列。
設置數據有效期
為
sensor
表設置數據有效期,時間單位為秒(s)。ALTER TABLE sensor SET TTL = '2592000';
為
sensor
表取消數據有效期。ALTER TABLE sensor SET TTL = '';
結果驗證
在集群管理系統的概覽頁面,單擊目標數據庫下的目標表名,可在當前詳情表格區域,查看ttl參數的值。如何進入集群管理系統,請參見登錄集群管理系統。
設置壓縮算法
設置
sensor
表的壓縮算法為ZSTD
。ALTER TABLE sensor SET COMPRESSION = 'ZSTD';
設置
sensor
表的壓縮算法為NONE
。ALTER TABLE sensor SET COMPRESSION = 'NONE';
結果驗證
在集群管理系統的概覽頁面,單擊目標數據庫下的目標表名。在當前詳情表格區域,單擊查看表屬性,查看COMPRESSION參數的值。
設置冷熱分離
關于冷熱分離的介紹,請參見冷熱分離介紹。
設置冷熱分界線
按時間戳冷熱分離
設置表sensor
表的冷熱分界線。寬表引擎會基于每一行數據實際寫入數據庫的時間戳(入庫時間戳)來計算是否需要將該數據歸檔至容量型云存儲。
-- 為表sensor開啟按按時間戳冷熱分離,設置冷熱分離時間點為一天。
ALTER TABLE sensor SET CHS = '86400', CHS_L2 = 'storagetype=COLD';
結果驗證
您可以通過SHOW TABLE VARIABLES FROM sensor LIKE 'CHS%';
語句,查看CHS和CHS_L2參數的值。SHOW VARIABLES
語法的詳細介紹,請參見SHOW VARIABLES。
按自定義時間列冷熱分離
按自定義時間列冷熱分離對自定義時間列存在限制和要求,在使用前請閱讀相關注意事項,具體內容請參見注意事項。
將自定義時間列time
設置為表sensor
的冷熱分界線。寬表引擎會基于每一行數據的time
列的時間戳(業務時間戳),來計算是否需要將該數據歸檔至容量型云存儲。
-- 為表sensor開啟按自定義列冷熱分離,設置冷熱分離時間點為一天,并按time列冷熱分離。
ALTER TABLE sensor SET CHS ='86400', CHS_L2 = 'storagetype=COLD', CHS_COLUMN = 'COLUMN=time';
結果驗證
您可以通過SHOW TABLE VARIABLES FROM sensor LIKE 'CHS%';
語句,查看CHS、CHS_L2和CHS_COLUMN參數的值。SHOW VARIABLES
語法的詳細介紹,請參見SHOW VARIABLES。
取消冷熱分界線
取消sensor表的冷熱分界線。
ALTER TABLE sensor SET CHS = '', CHS_L2 = '';
結果驗證
您可以通過SHOW TABLE VARIABLES FROM sensor LIKE 'CHS%';
語句,查看CHS和CHS_L2參數的值。SHOW VARIABLES
語法的詳細介紹,請參見SHOW VARIABLES。
執行Major Compaction
對sensor表執行Major Compaction。
ALTER TABLE sensor COMPACT;
說明如果實例為多可用區實例,需注意以下規則:
如果寬表引擎版本低于2.6.4.2版本,未指定IDC時,系統默認對idc1進行Major Compaction。
如果寬表引擎為2.6.4.2及以上版本,系統默認對所有的IDC進行Major Compaction。
對idc2執行Major Compaction。
ALTER TABLE sensor COMPACT 'idc2';
對idc1和idc2執行Major Compaction。
ALTER TABLE sensor COMPACT 'idc1,idc2';
=