INSERT INTO TABLE1 (COLUMN1, PRIMARY_KEY)
SELECT
COLUMN1,
(SELECT COALESCE(MAX(PRIMARY_KEY), 0)
FROM TABLE1) + 1
FROM
TABLE2
错误:
违反主键约束。无法在对象中插入重复键。
如何在第一行之后使主键递增?
我希望能够同时将项目列表添加到此表中,而不是插入 RBAR。
谢谢您的帮助
INSERT INTO TABLE1 (COLUMN1, PRIMARY_KEY)
SELECT
COLUMN1,
(SELECT COALESCE(MAX(PRIMARY_KEY), 0)
FROM TABLE1) + 1
FROM
TABLE2
错误:
违反主键约束。无法在对象中插入重复键。
如何在第一行之后使主键递增?
我希望能够同时将项目列表添加到此表中,而不是插入 RBAR。
谢谢您的帮助
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()
因为它本质上是不安全的。
你可以试试这个:
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 块以及事务处理的存储过程。
我想让你明白,在这种情况下,避免交易不是一种选择。如果您不专门使用事务,则有时两个 tprocesses 会尝试使用相同的 id 号。事实上,这就是为什么不推荐使用获取最后一个 ID 号的方法的原因,因为使用它很容易造成数据库问题。我知道您对此感到困惑,但至少要学会在未来永远不要使用这种短视的反模式。
您不必检查最大键并将 1 递增 1。将其设为一IDENTITY(1,1) NOT NULL
列,服务器将处理它。然后使用;
INSERT INTO TABLE1 (COLUMN1)
SELECT COLUMN1
FROM TABLE 2