仅在插入记录时才增加标识

时间:2009-05-05 10:05:51

标签: sql-server-2005 tsql transactions

sql server 2005:我在employee表中有一个empid列,其中包含identity。如果在将数据插入表时出现了一些错误,则会增加.ii要求只在插入记录时才增加标识。如果我有生成的emp id从1到5然后在第6个记录插入错误ocurrs.and下一个记录插入标识值将为7.i希望它为6。

4 个答案:

答案 0 :(得分:2)

你为什么要这样做?

标识列只应用作数据库的“内部管理值”,它应该没有“业务价值”,那么为什么该序列中存在间隙呢? 如果正确使用了身份,那么您的软件用户将永远不会面对具有身份值的列;你只需用它来唯一地识别一条记录。

答案 1 :(得分:1)

我不认为这可以做到。如果您希望您的身份编号完全按顺序排列,那么您可能必须自己生成它们,而不是使用SQL标识功能。

编辑:即使回滚失败的交易也不会使身份计数重新下降,这是设计使然,请参阅this other question

答案 2 :(得分:1)

如果存在差距,您有什么有效的商业理由来关心?数据库没有理由关心并且每个理由都希望确保身份值永远不会被重用于其他东西,因为它们可能会导致数据完整性出现重大问题,并根据旧报告查找信息等。假设您有报告显示上个月的订单,然后您删除其中一个记录,因为客户是重复的,因此被重复删除。然后,您为已删除的重复客户重用身份字段。上个月没有人看上去的报告去查找客户12345,与该菜肴相关的数据属于John Smith而不是Sally Jones。因为她使用的是聚合物,所以不要知道这个人,所以现在她的信息是完全可以避免的。如果她正在查找已删除的客户,则该流程可能会将她重定向到重复扣除后留下的正确客户。

答案 3 :(得分:0)

当您需要具有此特定行为时,应使用存储过程来生成ID。这样你就可以真正地回滚了。但请记住,目前的行为是出于目的。 当您不在masterdata表中使用包含当前或下一个ID值的id字段的锁定时,事务隔离和不同的读取级别(脏读)很可能会让您遇到麻烦。