使用手动自动递增ID

时间:2017-05-23 12:18:07

标签: sql sql-server tsql

我正在尝试编写一个将返回这些记录的查询:

select * 
from [CloneConfiguration] 
where InstrumentId = 2

enter image description here

并将它们插入到同一个表中,并更改以下列:

  1. Id - 新记录需要一个唯一的id号码(因为它是主键而不是定义为自动增量)

  2. Instrument id - 将工具ID更改为其他数字(例如3)

  3. 我尝试了以下不起作用的查询。

    INSERT INTO [CloneConfiguration] 
       SELECT 
           MAX(Id) + 1, 3,
           [SourceCCy1Id], [SourceCCy2Id], [SourceProviderId], 
           [TargetCCy1Id], [TargetCCy2Id], [TargetProviderId], [Remark]
       FROM 
           [CloneConfiguration] 
       WHERE 
           InstrumentId =2 
    

    错误:

      

    列'CloneConfiguration.SourceCCy1Id'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

2 个答案:

答案 0 :(得分:2)

您可以通过执行以下操作在单个查询中执行所需操作:

INSERT INTO [CloneConfiguration] 
    SELECT COALESCE(m.maxid + 1, 1), 3, [SourceCCy1Id], [SourceCCy2Id],
           [SourceProviderId], [TargetCCy1Id], [TargetCCy2Id], 
           [TargetProviderId], [Remark]
    FROM [CloneConfiguration] CROSS JOIN
         (SELECT max(id) as maxid FROM CloneConfiguration) m
    WHERE InstrumentId = 2 ;

如果您要插入多行,请同时使用row_number()

INSERT INTO [CloneConfiguration] 
    SELECT COALESCE(m.maxid, 0) + ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
           3, [SourceCCy1Id], [SourceCCy2Id],
           [SourceProviderId], [TargetCCy1Id], [TargetCCy2Id], 
           [TargetProviderId], [Remark]
    FROM [CloneConfiguration] CROSS JOIN
         (SELECT max(id) as maxid FROM CloneConfiguration) m
    WHERE InstrumentId = 2 ;

也就是说,正确的解决方案是将id定义为identity列。然后数据库负责分配唯一的ID。您的查询也没有竞争条件。因此,如果只有一个用户,则上述工作,但如果有多个用户则可能失败。

答案 1 :(得分:1)

这是假设sql-server,但我想你无论如何都明白了这一点:

DECLARE @MAXID INT = (SELECT MAX(Id) FROM [CloneConfiguration]) -- You probably want to number from the highest Id regardless of InstrumentId

INSERT INTO [CloneConfiguration] 
SELECT @MAXID + ROW_NUMBER() OVER(ORDER BY Id)
,      3
,      [SourceCCy1Id]
,      [SourceCCy2Id]
,      [SourceProviderId]
,      [TargetCCy1Id]
,      [TargetCCy2Id]   
,      [TargetProviderId]
,      [Remark]
FROM   [CloneConfiguration] 
WHERE  InstrumentId=2

我们的想法是首先获取当前表中的MAX(Id),并根据所选的ID添加ROW_NUMBER

顺便说一句,为要插入的列命名也是一个好主意:

INSERT INTO [CloneConfiguration] (Id, InstrumentId...)
...