查詢語句系列—掛載和解除安裝資料

weixin_34342992發表於2018-07-03

### 掛載(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 查詢將按照相同的順序來執行. 而,在複製表中更改列的查詢是中斷的, 所有的動作將非同步執行.

版權宣告:本文版權歸@神州雲聯科技有限公司所有,未經允許任何單位或個人不得轉載,複製或以任何其他方式使用本文全部或部分,侵權必究。

相關文章