在不丢失数据的情况下更改列类型

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

.alter column 命令会更改列类型,使原始数据无法恢复。 若要在更改列类型时保留预先存在的数据,可新建正确类型的表。

对于要在其中更改列类型的每个表 OriginalTable,请执行以下步骤:

  1. 使用正确的架构(正确的列类型和相同的列顺序)创建表 NewTable

  2. 将数据从 OriginalTable 引入 NewTable,应用所需的数据转换。 在下面的示例中,将 Col1 转换为字符串数据类型。

    .set-or-append NewTable <| OriginalTable | extend Col1=tostring(Col1)
    
  3. 使用 .rename tables 命令交换表单名称。

    .rename tables NewTable=OriginalTable, OriginalTable=NewTable
    

    命令完成后,现有引入管道中的新数据将流向现已正确键入的 OriginalTable

  4. 删除表 NewTable

    NewTable 仅包含架构更改之前的历史数据副本。 确认 OriginalTable 中的架构和数据已正确更新后,可以安全地删除。

    .drop table NewTable
    

示例

以下示例会在保留数据时更新 OriginalTable 的架构。

使用 guid 类型的列“Col1”来创建表 OriginalTable

.create table OriginalTable (Col1:guid, Id:int)

然后将数据引入 OriginalTable

.ingest inline into table OriginalTable <|
b642dec0-1040-4eac-84df-a75cfeba7aa4,1
c224488c-ad42-4e6c-bc55-ae10858af58d,2
99784a64-91ad-4897-ae0e-9d44bed8eda0,3
d8857a93-2728-4bcb-be1d-1a2cd35386a7,4
b1ddcfcc-388c-46a2-91d4-5e70aead098c,5

创建字符串类型的表 NewTable

.create table NewTable (Col1:string, Id:int)

将数据从 OriginalTable 追加到 NewTable,并使用 tostring() 函数将“Col1”列从 guid 类型转换为字符串类型。

.set-or-append NewTable <| OriginalTable | extend Col1=tostring(Col1)

交换表单名称。

.rename tables NewTable = OriginalTable, OriginalTable = NewTable

删除包含旧架构和数据的表 NewTable

.drop table NewTable