使用 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# 插入新行时,如何处理自动递增的列?一个例子将是很棒的:)
我不喜欢给出这样的答案...但无论如何,我都会在这个场合。
不要
如果在另一个表中存储更多数据,该表具有此表中 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