插入增量主键SQL多行(Insert multiple rows with incremental

2019-08-04 00:32发布

INSERT INTO TABLE1 (COLUMN1, PRIMARY_KEY)
   SELECT 
      COLUMN1,
      (SELECT COALESCE(MAX(PRIMARY_KEY), 0) 
        FROM TABLE1) + 1 
   FROM 
      TABLE2

错误:

PRIMARY KEY约束的冲突。 不能在对象中插入重复键。

如何让我的第一行后,主键的增量?

我想能的项目清单,同时在这个表格将它们插入到RBAR的。

谢谢您的帮助

Answer 1:

INSERT INTO TABLE1 (COLUMN1, PRIMARY_KEY)
SELECT COLUMN1,
       (SELECT COALESCE(MAX(PRIMARY_KEY),0)
       FROM TABLE1) + row_number() over (order by 1/0)
FROM TABLE 2

仅仅因为这个声明中,ID将是连续的,例如,如果Max(Primary Key)是99,它是将4个记录,他们将是100,101,102,103。这是非常容易出现违反约束,如果多个进程在插入同一时间,但是,这并不是说,这是任何比你有什么用呢使用单记录糟糕MAX()这是固有的不安全性。



Answer 2:

你可以试试这个:

DECLARE @CurrentPK INT
SELECT @CurrentPK(MAX(PRIMARY_KEY)

SELECT column1, ROW_NUMBER() OVER (ORDER BY column1) AS 'RowNumber'
INTO #temp
FROM Table2

INSERT INTO TABLE1
(COLUMN1, PRIMARY_KEY)
SELECT COLUMN1,@CurrentPK+RowNumber 
FROM #temp

当然,以防止竞争条件,你应该把这个在一个事务中,明确禁止其他刀片在同一时间发生。 最好的办法是用try6 catch块一个存储过程以及交易处理。

我希望你能明白,这是不以避免在这种情况下,交易的选项。 如果不明确使用事务,你将有时间在两个tprocessses尝试使用相同的ID号。 事实上,这就是为什么越来越不recommednd最后一个ID号,因为它太容易创建一个使用它的数据库问题的方法。 我知道你是坚持这一点,但至少学会从不使用这种短视的反模式的未来。



Answer 3:

您不必检查MAX键,并增加1由1.它的IDENTITY(1,1) NOT NULL列,服务器会照顾它。 然后使用;

INSERT INTO TABLE1 (COLUMN1)
SELECT COLUMN1
FROM TABLE 2


文章来源: Insert multiple rows with incremental primary key sql