使用C#和SQL在数据库中查找未使用的ID

时间:2013-01-31 16:23:42

标签: c# sql

我正在尝试用C#编写一个简单的数据库管理工具。我正在编写一个函数来向数据库插入一个新行,但我遇到了一个问题。我需要能够检测到尚未采用的ID号。我做了一些研究,但没有找到任何明确的答案。

Example table:
ID    Name
---------------
1     John
2     Linda
4     Mark
5     Jessica

如何添加一个自动检测到ID 3为空的函数,并在那里放置一个新条目?

编辑:我真正的问题是;当我想通过C#插入一个新行时,如何处理一个自动递增的列?一个例子很棒:)

4 个答案:

答案 0 :(得分:3)

我不喜欢这样给出答案......但是我会在这个场合继续。

<强>不

如果您将更多数据存储在另一个具有此表中ID的外键的表中,该怎么办?如果你重复使用数字,那么就要求参考完整性问题。

我假设你的领域是一个int?如果是这样,自动增量应该足以满足大多数目的。它使您的插入更简单,并保持完整性。

编辑:你可能有充分的理由去做,但我想说明一下有人出现并稍后会看到谁认为这是一个好主意。

答案 1 :(得分:1)

SQL:

SELECT ID From TABLE

SELECT  t.ID
FROM    ( SELECT    number + 1 AS ID
          FROM      master.dbo.spt_values
          WHERE     Type = 'p'
                    AND number <= ( SELECT  MAX(ID) - 1
                                    FROM    @Table
                                  )
        ) t
        LEFT JOIN @Table ON t.ID = [@Table].ID
WHERE   [@Table].ID IS NULL

C#

DataTable dt = new DataTable();
//Populate Dt with SQL
var tableInts = dt.Rows.Cast<DataRow>().Select(row => row.Field<int>("ID")).ToList<int>();
var allInts = Enumerable.Range(1, tableInts.Max()).ToList();
var minInt = allInts.Except(tableInts).Min();

答案 2 :(得分:0)

SELECT      #temp.Id
FROM        #temp
LEFT JOIN   table1 ON #temp.Id = table1.Id
WHERE       table1.Id IS NULL

试试这个?

但我的建议是,只是自动增加字段。

如何操作,将列的IDENTITY属性设置为true,并将其设置为主键(不为null)。

要处理插入,您可能需要触发器,类似于存储过程,但它们可以代替插入或更新或删除,或者在插入/更新/删除之前/之后

Google触发器。

答案 3 :(得分:0)

来自How do I find a "gap" in running counter with SQL?

select
    MIN(ID)
from (
    select
        0 ID
    union all
    select
        [YourIdColumn]+1
    from
        [YourTable]
    where
        --Filter the rest of your key--
    ) foo
left join
    [YourTable]
    on [YourIdColumn]=ID
    and --Filter the rest of your key--
where
    [YourIdColumn] is null