首页 > 解决方案 > 我有一个场景,当我需要在更改某些列后从同一个表中插入表时。问题是关键列

问题描述

可以说,

insert into A  select * from A where col1 = "ABC"

导致错误,因为会有相同的主键列,我想从表的最大 id 自动递增

CREATE TABLE  A(
    [WFID] [int] NOT NULL PRIMARY KEY,
    [EntityID1] [int] NOT NULL,
    [EntityID2] [int] NULL);



INSERT INTO WFCustom
SELECT * FROM WFCustom
WHERE EntityID2 = 6008 , 

由于 WFID 是主键而出现错误:

违反主键约束“PK_WF_Custom”。无法在对象“dbo.WFCustom”中插入重复键。该语句已终止。

标签: sqlsql-server

解决方案


我的第一个建议是修复您的数据模型。这看起来像:

CREATE TABLE A (
    [WFID] int IDENTITY(1, 1) PRIMARY KEY,
    [EntityID1] [int] NOT NULL,
    [EntityID2] [int] NULL
);

INSERT INTO WFCustom (EntityID1, EntityID2)
    SELECT EntityID1, EntityID2
    FROM WFCustom
    WHERE EntityID2 = 6008; 

这是确保主键唯一的最安全方法——数据库会处理它。

如果这不起作用,您可以分配一个新的。PSK提出的方法很好,虽然我会写成:

INSERT INTO WFCustom (WFID, EntityID1, EntityID2)
    SELECT (COALESCE(MAX_WFID, 0) +
            ROW_NUMBER() OVER (ORDER BY WFID)
           ) as new_WFID,
           EntityID1, EntityID2
    FROM WFCustom CROSS JOIN
         (SELECT MAX(WFID) as MAX_WFID FROM WFCustom) m
    WHERE EntityID2 = 6008; 

推荐阅读