Synapse SQL:将临时表合并到主表和自动增量标识

Posted

技术标签:

【中文标题】Synapse SQL:将临时表合并到主表和自动增量标识【英文标题】:Synapse SQL: Merging staging table into primary table and auto-increment identity 【发布时间】:2021-12-11 03:20:23 【问题描述】:

Azure Synapse 对主键 (https://docs.microsoft.com/en-us/azure/synapse-analytics/sql-data-warehouse/sql-data-warehouse-table-constraints) 有不同的方法,它不允许使用传统的标识列(例如,INT IDENTITY(1,1) NOT NULL PRIMARY KEY

我想使用合并语句来更新我拥有的表,但是使用 Synapse SQL,我不确定在合并新数据时如何获取自动增加的主键。考虑以下 MWE:


CREATE TABLE [table1]
  (  
    [primaryKey] INT IDENTITY(1,1) NOT NULL,
    [id] INT,
    [name] VARCHAR(25)
  )  
WITH ( CLUSTERED COLUMNSTORE INDEX,
DISTRIBUTION = HASH([id])
);

CREATE TABLE [table1_staging]
  (  
    [id] INT,
    [name] VARCHAR(25)
  );

INSERT INTO [table1_staging] 
(id, name) VALUES (1, 'john');


-- run merge
MERGE [table1] AS TARGET
USING [table1_staging] AS SOURCE 
-- match on ID
ON (TARGET.id = SOURCE.id)
-- when no match; insert
WHEN NOT MATCHED BY TARGET 
THEN INSERT ([id], [name]) VALUES(SOURCE.[id], SOURCE.[name]);

-- cannot update identity column

创建主键 (INT PRIMARY KEY NONCLUSTERED NOT ENFORCED) 的推荐方法不会自动递增,由于不允许 NULL,因此会导致合并失败。

【问题讨论】:

“无法更新标识列”?您的声明从未更新身份列,而且我从未遇到过您想要的情况。您需要更详细地解释。 你能发布你得到的错误吗?我现在不想为 Synapse 实例付费。 【参考方案1】:

你能不能试着打开它。

SET IDENTITY_INSERT table1 ON;

【讨论】:

【参考方案2】:

来自 MSFT,不支持:https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=azure-sqldw-latest&preserve-view=true#remarks

During the preview, MERGE…WHEN NOT MATCHED INSERT is not supported for tables with IDENTITY columns.

【讨论】:

以上是关于Synapse SQL:将临时表合并到主表和自动增量标识的主要内容,如果未能解决你的问题,请参考以下文章

通过 =Query 将多个工作表合并到主工作表后,如何自动组织数据?

优化 MERGE 语句的 SORT MERGE 连接

一个开发需求的解决方案 & Oracle 临时表介绍

向主表和子表同时插入数据如何写SQL语句

将数据添加到主表上的多个记录的链接表中

SQL Server 表变量和临时表的区别