sql - 我有一个场景,当我需要在更改某些列后从同一个表中插入表时。问题是关键列
问题描述
可以说,
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”中插入重复键。该语句已终止。
解决方案
我的第一个建议是修复您的数据模型。这看起来像:
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;
推荐阅读
- streaming - 应用程序远程演示流式传输困难
- c# - 从 Web Api 到 Asp.Net MVC 的长时间运行任务
- sql - SELECT COUNT(1) FROM 动态查询中的表
- newrelic - 我如何获取事件,跨帐户的警报计数
- python - 如何在python中将密度曲线添加到直方图
- mongodb - 如何使用 UTM 坐标从数据库中获取位置
- bash - Cygwin bash No such file or directory or command not found
- r - 在 emmeans 中定义对比
- c - 我想计算单词,但是一旦单词出现在句子中,它就不计算单词了
- ios - 如何在 Catalyst 应用程序中制作窗口模式?