我正在尝试用C#编写一个简单的数据库管理工具。我正在编写一个函数来向数据库插入一个新行,但我遇到了一个问题。我需要能够检测到尚未采用的ID号。我做了一些研究,但没有找到任何明确的答案。
Example table:
ID Name
---------------
1 John
2 Linda
4 Mark
5 Jessica
如何添加一个自动检测到ID 3为空的函数,并在那里放置一个新条目?
编辑:我真正的问题是;当我想通过C#插入一个新行时,如何处理一个自动递增的列?一个例子很棒:)
答案 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