### 掛載(ATTACH)
此查詢語句與 CREATE 語句類似,?
此語句本身并不在磁盤上創建數據, 假設 數據已經在合適的位置 , 則添加表相關信息到服務器上. 在執行 ATTACH 語句后, 服務器將知道表的存在.
如果數據庫的表之前已經卸載(DETACH), 意思是它的結構是已知的 , 你可以使用它作為快捷方式創建表,不需要定義表結構。
ATTACH TABLE [IF NOT EXISTS] [db.] name
當啟動服務器后,此查詢將可用。服務器保存表的元數據作為ATTACH掛載語句的文件,它在啟動時運行比較簡單。
### 卸載(DETACH)
從服務器上刪除相關表的信息. 清除服務器對表相關信息和表結構的記錄。
DETACH TABLE [IF EXISTS] [db.] name
它不刪除表的數據和元數據. 在下一次服務器啟動后,服務器將讀取元數據,再次找到相關的表. 與之類似的, 一個 "已卸載" 的表能夠使用ATTACH 語句重新掛載.
另外,并沒有 DETACH DATABASE 語句.
### 刪除語句(DROP)
此查詢有2種類型:?DROP DATABASE?和 DROP TABLE.
DROP DATABASE [IF EXISTS] db [ON CLUSTER cluster]
在 'db' 數據庫中刪除所有的表, 然后刪除 'db' 數據庫.如果IF EXISTS?被指定,如果數據庫不存在,則不返回錯誤。
DROP [TEMPORARY] TABLE [IF EXISTS] [db.] name [ON CLUSTER cluster]
刪除表 . 如果指定?IF EXISTS?,?如果表不存在或數據庫不存在,則不返回錯誤。
### 重命名(RENAME)
重命名單個表或多個表。
RENAME TABLE [db11.] name11 TO [db12.] name12, [db21.] name21 TO [db22.] name22,...[ON CLUSTER cluster]
所有的表在全局鎖下進行重命名操作. 重命名表是一個信號操作. 如果你在 TO 之后指定了另外一個數據庫, 此表將移動到此數據庫. 然而, 數據庫的路徑必須放在相同的文件系統中 (否則, 錯誤將返回).
### 更改語句(ALTER)
ALTER?查詢僅支持Merge、Distributed 或?*MergeTree?表, 此查詢有基本變量.
字段操作
更改表結構.
ALTER TABLE [db].name [ON CLUSTER cluster] ADD | DROP | MODIFY COLUMN...
在查詢過程中,指定一個逗號分隔的列表. 每個動作是對一個字段的操作.
如下的動作將被支持:
ADD COLUMN name[type][default_expr][AFTER name_after]
添加一個新字段到表中 ,表指定名稱、類型和默認表達式. 如果你指定?AFTER?name_after(另一個字段的名稱), 字段將在特定字段之后被添加. 否則, 此字段被添加到表的末尾. 目前還不支持在表的開頭添加新的字段。對于動作鏈,?'name_after'?是 一個列名被添加到之前的動作上.
添加一個列可改變表結構, 不需要執行任何的帶有數據的動作. 在?ALTER之后, 數據不出現在磁盤中. 當從表中讀取數據時,如果數據丟失, 它將填充默認值 (通過執行默認表達式, 或者使用0或空字符串). 在合并到數據分片之后,字段出現在磁盤上 (請參照合并樹(MergeTree)).
本方法可以讓你執行 ALTER 查詢, 而不需要增加老數據的磁盤卷.
DROP COLUMN name
刪除帶有名稱?'name' 的字段. 從文件系統中刪除數據. 當刪除整個文件后, 查詢立即可用.
MODIFY COLUMN name [type] [default_expr]
更改'name'列的類型到'type' 或者默認表達式到'default_expr'.當更改類型時,此值將被轉換,類似于在列上使用??'toType' 函數.
如果只有默認表達式更改,查詢不做復雜的操作,查詢執行也立即完成。
更改列類型也是復雜動作—它改變了數據文件的內容。對于一張大表,它將花很長時間。
有一些處理的階段:
為修改數據準備臨時文件
重命名舊文件
重命名臨時文件到舊的名稱
刪除舊文件
只有第一階段耗費時間. 如果在此階段發生故障, 數據將不改變. 如果在后續階段發生故障, 數據可被手動修復. 如果舊文件從文件系統中刪除,而新文件的數據還沒有寫到磁盤或者丟失,則發生異常。
不支持在數組和嵌套數據結構中更改字段。
ALTER?查詢允許你在嵌套數據結構中創建和刪除字段, 但是并不是整個嵌套數據結構. 為了添加一個嵌套數據結構, 你能夠添加帶有名稱?name.nested_name和 類型?Array(T)?的字段. 一個嵌套數據結構與 多個數組字段等價,并有相同的前綴.
不支持在主鍵上刪除字段或者樣本鍵(此列在Engine引擎表達式中)。改變主鍵列的類型,僅可能是此更改不會影響數據修改(例如,它允許添加值到Enum或者更改DateTime類型為UInt32)。
如果ALTER查詢對于更改表結構是不充足的,你可以創建一個新表,使用INSERT SELECT?語句將數據拷貝到新表中,然后使用RENAME查詢切換表,同時刪除舊的表。
ALTER請求阻塞了所有的讀寫操作. 換句話說, 如果一個?SELECT?語句在?ALTER語句執行時運行,?其他語句將等待ALTER?語句完成后再執行. 同時,對于相同表的 所有新查詢將等待,直到ALTER執行完成。
對于不存儲數據的表來說 (例如 Merge?和 Distributed),?ALTER 可以改變表的結構, 不改變下級表的結構. 例如, 當在分布式表中運行 ALTER 操作時, 你也需要運行ALTER 語句在所有的遠程節點服務器上.
對于更新字段的ALTER查詢是同步的. 具體配置保存在 ZooKeeper 中, 然后 每個副本節都可以使用它. 所有的 ALTER?查詢將按照相同的順序來運行. 而,在復制表中更改列的查詢是中斷的, 所有的動作將異步執行.
版權聲明:本文版權歸@神州云聯科技有限公司所有,未經允許任何單位或個人不得轉載,復制或以任何其他方式使用本文全部或部分,侵權必究。