【发布时间】:2014-05-08 17:53:23
【问题描述】:
我有一个带有主键字段 ID 的表。我不想使用身份,因为我需要给用户手动选择新对象的 ID 的可能性。所以我的想法是:
- 默认情况下,在编辑视图中,ID 字段将为 0。
- 如果用户不更改,我需要找到第一个空闲ID并使用它。
- 如果用户更改 ID,我首先需要检查是否有另一个具有该 ID 的对象,在这种情况下抛出错误。
- 如果没有,请使用用户选择的 ID。
- 创建新对象
问题是如何查询SQL Server表来获得第一个免费ID号?
示例 1:
ID
--
1
2
10
第一个空闲 ID 是 3
示例 2:
ID
--
1
2
3
4
第一个空闲 ID 是 5
有没有办法做到这一点? 我能想到的就是获取最小值和最大值,为可能的值创建一个循环,然后与表数据进行比较,但这涉及到对数据库的太多查询。 谢谢!
【问题讨论】:
-
我有一个带有主键字段 ID 的表 - 嗯。如果您弄乱了该字段,则不要将其设为主键。仅对该值使用普通列。
-
@juergend 。 . .阅读 OP 想要做什么。它不是“搞乱那个领域”。 OP 只是想让用户选择一个值,如果可能的话,否则在一个范围内获得另一个合理的值。
-
没错。就像手动实现自动数字字段一样,可以跳过一些值。
-
@ercpap - 有什么理由专门这样做吗?我认为当您可以使用
IDENTITY或自动增量之类的东西时,该解决方案将很难实施 -
身份字段跳过值是有原因的,它与数据完整性有关。在您的场景中重用已删除的值是一个非常危险的想法。这是您向用户推送的要求类型,告诉他们这是非常危险的,不是一个好的做法。如果您这样做,请确保您在数据库中设置了正确的 FK,否则您将 100% 保证在短时间内获得错误数据。顺便说一句,您要从不更改它们的用户那里输入多少个 0?
标签: sql sql-server