1

我正在尝试为插入到 SQL Server 2005 数据库表中的记录分配 ID 号。由于可以删除这些记录,因此我希望为这些记录分配表中的第一个可用 ID。例如,如果我有下表,我希望在 ID 4 处输入下一条记录,因为它是第一个可用的。

    | ID | Data |
    | 1  | ...  |
    | 2  | ...  |
    | 3  | ...  |
    | 5  | ...  |

我希望这样做的方法是通过 SQL 查询建立可用 ID 的列表。从那里,我可以在我的应用程序代码中进行所有检查。

因此,总而言之,我想要一个 SQL 查询,它可以从特定表列中检索 1 到 99999 之间的所有可用 ID。

4

5 回答 5

2

首先建立一个包含所有 N 个 ID 的表。

declare @allPossibleIds table (id integer)
declare @currentId integer

select @currentId = 1
while @currentId < 1000000
begin
    insert into @allPossibleIds
    select @currentId

    select @currentId = @currentId+1
end

然后,将该表左连接到您的真实表。如果需要,您可以选择 MIN,或者您可以将 allPossibleIDs 限制为小于最大表 ID

select a.id 
from @allPossibleIds a  
left outer join YourTable t
on a.id = t.Id
where t.id is null 
于 2013-07-25T12:52:57.647 回答
0

不求身份,

让我给你一个简单的选择,而我正在做一个合适的选择。

将 int 从 1-999999 存储在一个表中,比如 Insert_sequence。

尝试写一个 Sp 用于插入,

您可以轻松识别 Insert_sequence 中存在的最小值,而不是

您的主表,将此值存储在变量中,然后从变量中插入带有 ID 的行。

问候

阿舒托什·艾莉亚

于 2013-07-25T12:53:13.010 回答
0

你也可以循环遍历这些键。当你打一个空的选择它并退出循环。

DECLARE @intStart INT, @loop bit
SET @intStart = 1 
SET @loop = 1

WHILE (@loop = 1)
BEGIN
    IF NOT EXISTS(SELECT [Key] FROM [Table] Where [Key] = @intStart)
        BEGIN
        SELECT @intStart as 'FreeKey'
        SET @loop = 0
        END

SET @intStart = @intStart + 1
END
GO

从那里您可以随意使用密钥。设置 @intStop 来限制循环字段是没有问题的。

于 2013-07-25T13:07:46.787 回答
0

为什么你需要一个来自 1..999999 的表你需要的所有信息都在你的源表中。这是一个查询,它为您提供最小的 ID 以插入间隙。它适用于所有组合:

(2,3,4,5) - > 1
(1,2,3,5) - > 4
(1,2,3,4) - > 5

SQLFiddle 演示

select min(t1.id)+1 from 
(
  select id from t 
  union 
  select 0
 )

t1 
left join t as t2 on t1.id=t2.id-1
where t2.id is null
于 2013-07-25T13:13:27.867 回答
-1

许多人使用自增整数或长整数值作为表的主键,通常称为IDorMyEntityID或类似名称。这个列,因为它只是一个自动递增的整数,通常与存储的数据本身无关。

这些类型的“主键”称为代理键。它们没有任何意义。许多人喜欢这些类型的 ID 是连续的,因为它“美观”,但这是在浪费时间和资源。数据库可能不太关心哪些 ID 正在使用,哪些没有。

我强烈建议您忘记尝试这样做,而让 ID 列自动递增。您还应该在表上创建一个索引,该索引由可以唯一标识表中每条记录的那些(子集)列组成(甚至考虑使用此索引作为主键索引)。在需要使用所有列来完成此操作的极少数情况下,自动递增的主键 ID 非常有用——因为在表中的所有列上创建索引可能性能不佳。即便如此,数据库引擎也可能不太关心这个 ID(例如,哪些 ID 正在使用,哪些未在使用等)。

还要考虑基于整数的 ID 最多有 42 亿个 ID。您不太可能在任何短时间内耗尽基于整数的 ID 的供应,这进一步支持了为什么这种事情是浪费时间和资源的论点。

于 2013-07-25T12:55:59.367 回答