你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

.update table 命令

适用于:✅Microsoft Fabric✅Azure 数据资源管理器

.update table 命令通过原子删除和追加记录在指定表中执行数据更新。

警告

此命令不可恢复。

注意

在作为更新策略源的表上运行 .update table 命令时,.update table 命令将触发这些更新策略,其中被修改的表是更新策略源。

一条命令最多可以删除 500 万条记录。

权限

你必须至少具有表管理员权限才能运行此命令。

语法

注意

简化的语法在预览版中可用,但已被弃用。

详细了解语法约定

.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运算符。
  • 追加和删除查询应生成确定性结果。 非确定性查询可能会导致意外结果。 当且仅当返回相同的数据(如果多次执行)时,查询是确定性的。
  • 查询可能会在update执行中多次执行。 如果中间查询结果不一致,更新命令可能会生成意外结果。

支持的属性

名称 Type 描述
whatif bool 如果为true,则返回每个数据库分片中将追加/删除的记录数,而不实际追加/删除任何记录。 默认为 false
distributed 布尔 如果为 true,则此命令将以并行方式从执行查询的所有节点引入。 默认值为 false。 请参阅性能提示

重要

建议先在whatif模式下运行,然后再执行更新以在删除或追加数据之前验证谓词。

返回

该命令的结果是表,其中每个记录表示使用新数据创建的或删除了记录的盘区

名称 Type 描述
string 在其中创建或删除盘区的表。
操作 string 创建删除,具体取决于对盘区执行的操作。
ExtentId guid 命令创建或删除的盘区的唯一标识符。
RowCount long 命令在指定区中创建或删除的行数。

.update table视图和具体化视图之间进行选择

在某些情况下,可以使用.update table命令或具体化视图在表中实现相同的目标。 例如,具体化视图可用于保留每个记录的最新版本,或者更新可用于在新版本可用时更新记录。

使用以下准则确定要使用的方法:

  • 如果具体化视图不支持更新模式,请使用更新命令。
  • 如果源表具有较高的引入量,但只有少数更新,则使用更新命令的性能可能更高,并且消耗的缓存或存储也比具体化视图少。 这是因为具体化视图需要重新处理所有引入的数据,这比根据追加或删除谓词标识要更新的各个记录效率低。
  • 具体化视图是完全托管的解决方案。 具体化视图定义一次,具体化由系统在后台发生。 更新命令需要一个协调的过程(例如,Azure 数据工厂逻辑应用Power Automate 等),每次有更新时显式执行更新命令。 如果具体化视图适用于你的用例,则使用具体化视图需要的管理和维护更少。

性能提示

  • 数据引入是一项占用大量资源的操作,可能会影响群集上的并发活动(包括正在运行的查询)。 建议避免以下资源密集型操作:一次性运行多个 .update 命令,并大量使用 distributed 属性
  • 将每次操作的追加数据限制在 1 GB 以下。 如有必要,请使用多个更新命令。
  • 仅当查询生成的数据量很大,超过 1 GB,且不需要序列化时,才将 distributed 标志设置为 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 条记录的表,其开头为:

ID 代码 Color
1 员工 蓝色
2 客户 灰色
3 员工 Red
4 客户 蓝色
5 员工 灰色
6 客户 Red
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";

更新多行上的单个列

以下示例将那些具有“blue”值的行中的一个单独列 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),但仍插入在主表中(更新插入行为)。

复合键

第一个命令使用复合键创建表:

.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";