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

本文关键字:查找 未使用 ID 数据库 SQL 使用 | 更新日期: 2023-09-27 17:56:47

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

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

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

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

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

我不喜欢给出这样的答案...但无论如何,我都会在这个场合。

不要

如果在另一个表中存储更多数据,该表具有此表中 ID 的外键,该怎么办?如果您重复使用数字,那么您将在引用完整性方面遇到麻烦。

我假设你的字段是一个整数?如果是这样,对于大多数目的来说,自动增量应该绰绰有余。它使您的刀片更简单,并保持完整性。

编辑:你可能有一个很好的理由这样做,但我想说明这一点,以防有人出现并稍后看到这个,他们认为这是一个好主意。

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();
SELECT      #temp.Id
FROM        #temp
LEFT JOIN   table1 ON #temp.Id = table1.Id
WHERE       table1.Id IS NULL

试试这个?

但我的建议是,只需自动递增字段即可。

您的工作方式是,将列的 IDENTITY 属性设置为 true,并将其也设置为主键(非 null)。

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

起作用

谷歌触发器。

来自 如何找到使用 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