Sql 直到你找到一个未使用的ID。很抱歉你运气不好。我承认这没有找到丢失的值1。然而,这是一个虚假的问题,这是我真正的观点,所以我对提出解决方案不感兴趣!:-p文档编号永远不会被删除。不过,我同意你的看法,这是一种识别文档的糟糕方法。不过,我正在挑起我的战斗,还

Sql 直到你找到一个未使用的ID。很抱歉你运气不好。我承认这没有找到丢失的值1。然而,这是一个虚假的问题,这是我真正的观点,所以我对提出解决方案不感兴趣!:-p文档编号永远不会被删除。不过,我同意你的看法,这是一种识别文档的糟糕方法。不过,我正在挑起我的战斗,还,sql,sql-server,gaps-and-islands,Sql,Sql Server,Gaps And Islands,直到你找到一个未使用的ID。很抱歉你运气不好。我承认这没有找到丢失的值1。然而,这是一个虚假的问题,这是我真正的观点,所以我对提出解决方案不感兴趣!:-p文档编号永远不会被删除。不过,我同意你的看法,这是一种识别文档的糟糕方法。不过,我正在挑起我的战斗,还有更重要的事情要做。这是否可以在子选择中完成以拾取第一个不匹配项,然后与max(id)+1合并以一次性完成?是否有SQL示例?这将丢失从范围开头开始的任何连续id块。例如,如果table有ID(5,6,8,9,10),则返回7,而不是1-4中的


直到你找到一个未使用的ID。很抱歉你运气不好。我承认这没有找到丢失的值1。然而,这是一个虚假的问题,这是我真正的观点,所以我对提出解决方案不感兴趣!:-p文档编号永远不会被删除。不过,我同意你的看法,这是一种识别文档的糟糕方法。不过,我正在挑起我的战斗,还有更重要的事情要做。这是否可以在子选择中完成以拾取第一个不匹配项,然后与max(id)+1合并以一次性完成?是否有SQL示例?这将丢失从范围开头开始的任何连续id块。例如,如果
table
有ID(5,6,8,9,10),则返回7,而不是1-4中的任何一个。@joshperry您是对的。我错过了关于想要填充所有大于零的id的评论。我加了一个丑陋的补丁。也许有人会建议改进。+1非常有帮助,谢谢!这里的大多数其他答案是“你不需要这样做,让系统增加密钥”,但我的情况不是主键,而是另一个唯一的数字字段,其中空插槽是一个问题,但可能会发生,而不是由于删除。第一部分有更简单的版本<代码>从t1中选择最大值(t1.Id+1),它将为您提供新的最高Id。如果在3之前,它将返回4。@Darreller,您要求改进-请参阅我的答案:)比最高答案+1快得多!好文章:
var nums = new [] { 1,2,3,4,6,7,9,10};

int nextNewNum = (
    from n in nums
    where !nums.Select(nu => nu).Contains(n + 1)
    orderby n
    select n + 1
).First();
DECLARE @counter int
DECLARE @max
SET @counter = 0
SET @max = SELECT MAX(Id) FROM YourTable
WHILE @counter <= @max
BEGIN
    SET @counter = @counter + 1
    IF NOT EXISTS (SELECT Id FROM YourTable WHERE Id = @counter)
        BREAK
    END
END
select top 1 (found.id + 1) nextid from (select id from items union select 0) found
    where not exists (select * from items blocking
                          where blocking.id = found.id + 1)
    order by nextid asc
SELECT TOP 1 t1.Id+1 
FROM table t1
WHERE NOT EXISTS(SELECT * FROM table t2 WHERE t2.Id = t1.Id + 1)
ORDER BY t1.Id
SELECT TOP 1 * FROM (
    SELECT t1.Id+1 AS Id
    FROM table t1
    WHERE NOT EXISTS(SELECT * FROM table t2 WHERE t2.Id = t1.Id + 1 )
    UNION 
    SELECT 1 AS Id
    WHERE NOT EXISTS (SELECT * FROM table t3 WHERE t3.Id = 1)) ot
ORDER BY 1
SELECT TOP 1 t1.id+1
FROM mytable t1
 LEFT OUTER JOIN mytable t2 ON (t1.id + 1 = t2.id)
WHERE t2.id IS NULL
ORDER BY t1.id;
User 1                User 2
Find Id               
                      Find Id
Id = 42               
                      Id = 42
Insert (42..)  
                      Insert (42..)
                      Error!
select
    MIN(NextID) NextUsableID
from (
    select (case when c1 = c2 then 0 
            else c1 end) NextID 
    from (  select ROW_NUMBER() over (order by record_id) c1, 
                   record_id c2
            from   myTable)
)
where NextID > 0
declare @value int

select @value = case 
                  when @value is null or @value + 1 = idcolumn 
                    then idcolumn 
                  else @value end
   from table
   order by idcolumn

select @value + 1
SELECT MIN(MT1.MyInt+1)
FROM MyTable MT1
LEFT OUTER JOIN MyTable MT2 ON (MT1.MyInt+1)=MT2.MyInt
WHERE MT2.MyInt Is Null
CREATE TABLE Test
(
    ID int NOT NULL
)

--Insert values here

;WITH CTE AS
(
    --This is called once to get the minimum and maximum values
    SELECT nMin = 1, MAX(ID) + 1 as 'nMax' 
    FROM Test
    UNION ALL
    --This is called multiple times until the condition is met
    SELECT nMin + 1, nMax 
    FROM CTE
    WHERE nMin < nMax
)

--Retrieves all the missing values in the table. Removing TOP 1 will
--list all the unused numbers up to Max + 1
SELECT TOP 1 nMin
FROM CTE
WHERE NOT EXISTS
(
    SELECT ID
    FROM Test
    WHERE nMin = ID
)
SELECT MIN(a.id) + 1 AS firstfree
FROM (SELECT id FROM table UNION SELECT 0) a
LEFT JOIN table b ON b.id = a.id + 1
WHERE b.id IS NULL
SELECT MIN(a.id) + 1 AS firstfree
FROM (SELECT id FROM table WHERE column = 4711 UNION SELECT 0) a
LEFT JOIN table b ON b.column = 4711 AND b.id = a.id + 1
WHERE b.id IS NULL
Select Top 1 IdGapCheck
From (Select Id, ROW_NUMBER() Over (Order By Id Asc) AS IdGapCheck
    From dbo.table) F
Where Id > IdGapCheck
Order By Id Asc
SELECT MIN(NI) FROM
        (SELECT ROWNUM AS NI,YOUR_ID
         FROM (SELECT YOUR_ID
               FROM YOUR_TABLE 
               ORDER BY YOUR_ID ASC))
WHERE NI<>YOUR_ID