共用方式為


.update 資料表命令

適用於: ✅Microsoft網狀架構Azure 數據總管

.update table此命令會藉由以不可部分完成的方式刪除和附加記錄,在指定的數據表中執行數據更新。

警告

無法復原此命令。

注意

當您在更新原則來源的數據表上執行 .update table 命令時,.update table命令會觸發修改數據表的這些更新原則是更新原則來源。

您可以在單一命令中刪除最多500萬筆記錄。

權限

您必須至少有 資料表管理員 許可權才能執行此命令。

Syntax

注意

預覽期間提供的簡化語法已被取代。

深入瞭解 語法慣例

.update[async] table TableName delete DeleteIdentifier append AppendIdentifier [with ( propertyName = propertyValue ] )<|
letDeleteIdentifier=DeletePredicate;
letAppendIdentifier=AppendPredicate;

參數

姓名 類型​​ 必要 描述
async string 如果指定,表示命令會以異步模式執行。
TableName string ✔️ 要更新的數據表名稱。
DeleteIdentifier string ✔️ 用來指定套用至更新數據表之刪除述詞的標識碼名稱。
DeletePredicate string ✔️ 查詢的文字,其結果會做為要刪除的數據。 述詞與虛刪除述詞具有相同的限制。
AppendIdentifier string ✔️ 用來指定套用至更新數據表之附加述詞的標識碼名稱。
AppendPredicate string ✔️ 查詢的文字,其結果會做為要附加的數據。

重要

  • 刪除和附加述詞都無法使用遠端實體、跨資料庫和跨叢集實體。 述詞無法參考外部數據表或使用 externaldata 運算元。
  • 附加和刪除查詢應該會產生具決定性的結果。 非決定性查詢可能會導致非預期的結果。 只有在查詢多次執行時才會傳回相同的數據,查詢才會具決定性。
  • 查詢可能會在執行中 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 FactoryLogic AppsPower 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";