.update 資料表命令
適用於: ✅Microsoft網狀架構✅Azure 數據總管
.update table
此命令會藉由以不可部分完成的方式刪除和附加記錄,在指定的數據表中執行數據更新。
警告
無法復原此命令。
權限
您必須至少有 資料表管理員 許可權才能執行此命令。
Syntax
注意
預覽期間提供的簡化語法已被取代。
深入瞭解 語法慣例。
.update
[async]
table
TableName delete
DeleteIdentifier append
AppendIdentifier [with
(
propertyName =
propertyValue ] )
<|
let
DeleteIdentifier=
DeletePredicate;
let
AppendIdentifier=
AppendPredicate;
參數
姓名 | 類型 | 必要 | 描述 |
---|---|---|---|
async | string |
如果指定,表示命令會以異步模式執行。 | |
TableName | string |
✔️ | 要更新的數據表名稱。 |
DeleteIdentifier | string |
✔️ | 用來指定套用至更新數據表之刪除述詞的標識碼名稱。 |
DeletePredicate | string |
✔️ | 查詢的文字,其結果會做為要刪除的數據。 述詞與虛刪除述詞具有相同的限制。 |
AppendIdentifier | string |
✔️ | 用來指定套用至更新數據表之附加述詞的標識碼名稱。 |
AppendPredicate | string |
✔️ | 查詢的文字,其結果會做為要附加的數據。 |
重要
- 刪除和附加述詞都無法使用遠端實體、跨資料庫和跨叢集實體。 述詞無法參考外部數據表或使用
externaldata
運算元。 - 附加和刪除查詢應該會產生具決定性的結果。 非決定性查詢可能會導致非預期的結果。 只有在查詢多次執行時才會傳回相同的數據,查詢才會具決定性。
- 例如,不建議使用
take
運算符、sample
運算元、rand
函式和其他這類運算符,因為這些運算符不具決定性。
- 例如,不建議使用
- 查詢可能會在執行中
update
多次執行。 如果中繼查詢結果不一致,update 命令可能會產生非預期的結果。
支援的屬性
名稱 | 類型 | 描述 |
---|---|---|
whatif | bool | 如果 true 為 ,則會傳回將在每個分區中附加/刪除的記錄數目,而不附加/刪除任何記錄。 預設值為 false 。 |
分散式 | bool | 如果 true 為 ,則命令會從所有平行執行查詢的節點擷取。 預設值為 false 。 請參閱 效能秘訣。 |
重要
建議您先在模式中 whatif
執行,再執行更新,以在刪除或附加數據之前先驗證述詞。
傳回
命令的結果是數據表,其中每個記錄都代表以新數據建立或已刪除記錄的範圍。
名稱 | 類型 | Description |
---|---|---|
Table | string |
建立或刪除範圍所在的數據表。 |
動作 | string |
根據在範圍上執行的動作來建立或刪除。 |
ExtentId | guid |
命令所建立或刪除範圍的唯一標識符。 |
RowCount | long |
命令在指定範圍中建立或刪除的數據列數目。 |
.update table
選擇和具體化檢視
在某些情況下,您可以使用 .update table
命令或 具體化檢視 在數據表中達成相同的目標。 例如,具體化檢視可用來保留每個記錄的最新版本,或更新可用來在新版本可用時更新記錄。
使用下列指導方針來決定要使用的方法:
- 如果具體化檢視不支援您的更新模式,請使用 update 命令。
- 如果源數據表具有高擷取磁碟區,但只有少數更新,則使用 update 命令的效能可能比具體化檢視更高效,而且耗用較少的快取或記憶體。 這是因為具體化檢視需要重新處理所有擷取的數據,這比根據附加或刪除述詞識別要更新的個別記錄效率低。
- 具體化檢視是完全受控的解決方案。 具體化檢視定義 一次 ,且系統會在背景進行具體化。 更新命令需要協調的程式(例如, Azure Data Factory、 Logic Apps、 Power Automate 和其他程式),每次有更新時,都會明確執行更新命令。 如果具體化檢視適用於您的使用案例,則使用具體化檢視需要較少的管理和維護。
效能祕訣
- 數據擷取是資源密集型作業,可能會影響叢集上的並行活動,包括執行查詢。 建議您避免下列耗用大量資源的動作:一次執行許多
.update
命令,以及大量使用 分散式 屬性。 - 將附加數據限制為每個作業少於 1 GB。 如有必要,請使用多個更新命令。
distributed
只有當查詢所產生的數據量很大、超過 1 GB 且不需要串行化時,才會將旗標true
設定為 :多個節點接著可以平行產生輸出。 當查詢結果很小時,請勿使用此旗標,因為它可能會不必要地產生許多小型數據分區。
範例
針對範例,我們將使用下表:
.set-or-replace Employees <|
range i from 1 to 100 step 1
| project Id=i
| extend Code = tostring(dynamic(["Customer", "Employee"])[Id %2])
| extend Color = tostring(dynamic(["Red", "Blue", "Gray"])[Id %3])
此命令會建立一個包含 100 筆記錄的數據表,開頭為:
識別碼 | 程式碼 | Color |
---|---|---|
1 | 員工 | 藍色 |
2 | 客戶 | 灰色 |
3 | 員工 | 紅 |
4 | 客戶 | 藍色 |
5 | 員工 | 灰色 |
6 | 客戶 | 紅 |
6 | 員工 | 藍色 |
更新單一數據列上的單一數據行
下列範例會更新單一數據列上的單一數據列:
.update table Employees delete D append A with(whatif=true) <|
let D = Employees
| where Id==3;
let A = Employees
| where Id==3
| extend Color="Orange";
請注意, whatif
設定為 true。 在此查詢之後,數據表不會變更,但命令會傳回一個範圍,其中一個數據列已刪除,且具有一個數據列的新範圍。
下列命令實際上會執行更新:
.update table Employees delete D append A <|
let D = Employees
| where Id==3;
let A = Employees
| where Id==3
| extend Color="Orange";
更新多個數據列上的單一數據行
下列範例會將單一數據行Color
上的值更新為具有藍色值的數據列上的 Green 值。
.update table Employees delete D append A <|
let D = Employees
| where Code=="Employee"
| where Color=="Blue";
let A = D
| extend Color="Green";
在這裡, 我們重複使用附加述詞定義中的刪除標識碼 。
更新多個數據列上的多個數據行
下列範例會以色彩灰色更新所有數據列上的多個數據行。
.update table Employees delete D append A <|
let D = Employees
| where Color=="Gray";
let A = D
| extend Code=strcat("ex-", Code)
| extend Color="";
使用另一個資料表更新資料列(參考值)
在此範例中,第一個步驟是建立下列對應數據表:
.set-or-replace ColorMapping <|
datatable(OldColor:string, NewColor:string)[
"Red", "Pink",
"Blue", "Purple",
"Gray", "LightGray",
"Orange", "Yellow",
"Green", "AppleGreen"
]
接著,此對應數據表會用來更新原始數據表中的某些色彩:
.update table Employees delete D append A <|
let D = Employees
| where Code=="Customer";
let A = D
| lookup ColorMapping on $left.Color==$right.OldColor
| project Id, Code, Color=NewColor
使用數據數據表更新數據列
有時候,更新的值是已知的,而不儲存在數據表中,而且 數據數據表運算符 可能很有説明:
.update table Employees delete D append A <|
let A = datatable(Id:long, Code:string, Color:string)[
1, "Customer", "Purple",
2, "Customer", "Magenta",
3, "Customer", "Turquoise",
];
let D = Employees
| join kind=leftsemi A on Id
| where true;
使用臨時表更新數據列
常見的模式是在更新主數據表之前先登陸臨時表中的數據。
第一個命令會建立臨時表:
.set-or-replace MyStagingTable <|
range i from 70 to 130 step 5
| project Id=i
| extend Code = tostring(dynamic(["Customer", "Employee"])[Id %2])
| extend Color = tostring(dynamic(["Red", "Blue", "Gray"])[Id %3])
下一個命令會使用臨時表中的數據來更新主資料表:
.update table Employees delete D append A <|
let A = MyStagingTable;
let D = Employees
| join kind=leftsemi MyStagingTable on Id
| where true;
臨時表中的某些記錄不存在於主數據表中(亦即,有 Id>100
),但仍插入主數據表中(upsert 行為)。
複合索引鍵
第一個命令會建立具有複合索引鍵的數據表:
.set-or-replace VersionedArticle <|
datatable(ArticleId:string, Version:int, Detail:string)[
"A", 1, "Early version",
"B", 1, "News about mobiles",
"C", 1, "Opinion article",
"B", 2, "Revision about brand X",
"B", 3, "Revision about brand Y",
"C", 2, "Fact check"
]
下一個命令會使用展開的語法來更新特定記錄:
.update table VersionedArticle delete D append A <|
let D = VersionedArticle
| where ArticleId=="B"
| where Version==3;
let A = VersionedArticle
| where ArticleId=="B"
| where Version==3
| extend Detail = "Revision about brand Z";