【问题标题】:Synapse SQL: Merging staging table into primary table and auto-increment identitySynapse SQL:将临时表合并到主表和自动增量标识
【发布时间】: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 实例付费。

标签: sql azure-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.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-25
      • 2012-04-28
      • 2022-10-12
      • 2021-09-05
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多