我有一个表,其主键是正整数:
CREATE TABLE T
(
ID int PRIMARY KEY CHECK (ID > 0) -- not an IDENTITY column
-- ... other irrelevant columns...
)
给定一个正整数N,我想插入N个记录,ID为1-N,如果已经存在一个特定的ID记录,则希望插入下一个最高未使用的ID。例如,当N= 5时:
If the table contains... Then insert...
(Nothing) 1,2,3,4,5
1,2,3 4,5,6,7,8
3,6,9,12 1,2,4,5,7
这是一种比较朴素的方法:
这里有一个天真的做法:
DECLARE @N int = 5 -- number of records to insert
DECLARE @ID int = 1 -- next candidate ID
WHILE @N > 0 -- repeat N times
BEGIN
WHILE EXISTS(SELECT * FROM T WHERE ID = @ID) -- conflicting record?
SET @ID = @ID + 1
INSERT T VALUES (@ID)
SET @ID = @ID + 1
SET @N = @N - 1
END
但是如果E是现有记录的数量,那么在最坏的情况下,此代码执行E + N次 SELECT 和 N次 INSERT,效率相当低。
是否有一种聪明的方法可以使用少量SELECT和仅一个INSERT来执行此任务?