我正在制作一个存储联系人的SQL数据库。我希望能够删除联系人,每个联系人的正确ID对于我的软件连接至关重要。假设我有一个名为James的联系人,他是第一个,他的ID是0。我添加了Mary,她的ID是1。如果我删除James,如何将Mary的ID设置为0而不是保持1?因为现在她是第一个,所以必须重置。换句话说,当某人被删除时,如何重置数据库中所有ID?谢谢。
我正在制作一个存储联系人的SQL数据库。我希望能够删除联系人,每个联系人的正确ID对于我的软件连接至关重要。假设我有一个名为James的联系人,他是第一个,他的ID是0。我添加了Mary,她的ID是1。如果我删除James,如何将Mary的ID设置为0而不是保持1?因为现在她是第一个,所以必须重置。换句话说,当某人被删除时,如何重置数据库中所有ID?谢谢。
在很多方面来说,这是一个非常糟糕的想法。我在考虑是否应该告诉你如何做这件事。一旦行的身份被设置,就不应该有更改其身份的原因。
如果确实需要更改身份,则您可能使用了错误的字段作为主键标识符。我在这里做出一个假设,即您正在谈论作为主键字段的PK字段,该字段也是标识列。
请记住,如果您创建任何链接到联系人表的表,并且开始更改Id,则还需要更新所有这些表。这将变得非常昂贵...
如果数据库中有大量记录,使用自增长列会使查询变得非常缓慢。自增长列对您没有帮助,您需要使用一些自定义的T-SQL来更改所有数字 - 但在我看来这是一个非常糟糕的想法。
如果您需要跟踪添加顺序,为什么不使用日期/时间戳呢?
您需要重新考虑您的设计。
这不是ID的工作方式,也不应该是ID的工作方式。ID不应该改变,否则所有链接的信息都将指向错误的行。
相反,为什么不添加一个由你控制的“External_ID”列? 或者在查询中动态编号(使用计算列?)
UPDATE table
SET secondaryID = secondaryID - 1
WHERE secondaryID > (SELECT secondaryID FROM table WHERE primaryID = [id to delete]);
DELETE FROM table
WHERE primaryID = [id to delete];
我强烈反对这样的做法 - 如果你的ID是由于删除记录而出现“缺失”值,软件应该测试这些值是否存在,而不是只是出现错误。
每次删除一行时重新编号自增列并不是解决这个问题的最佳方法。最好使用其他方法来解决。
如果不知道您的应用程序为何需要这样做,很难确定需要采取哪些方法。但是,您的应用程序需要这种功能可能表明某个地方存在设计问题。
您正在将id用作不仅仅是标识符。如果是这种情况,您将无法使用自动增量字段。您需要在代码中处理此问题。
复杂吧?这就是为什么最好从一开始就做好准备;)(我从经验中学到了这个)如果您有任何更多问题,请发送电子邮件至mraarone et yahoo d0t com。
我编写了一个应用程序来处理多级销售计划。 当然,人们会退出。在我们的计划中,还需要插入新人。
你已经走在正确的轨道上,只需要做出一些修改。
身份证号(ID)和序列号(seq)是两个不同的概念。 它们之间没有任何关系。
永远不要更改ID。一旦分配,就永久保留。
在你的表中创建一个列(cNEXT)用于序列,并使用ID填充它。 “下一个序列中的ID是什么?”
随时重新排列cNEXT中的ID,重新分配cNEXT。 任何存储过程都可以完成这项任务。
这样,你也可以灵活地创建非连续的ID链。 当人们转移到不同的地区或晋升到不同的组时,这非常有用。
希望这能帮到你! :)
所有答案都假设这是生产环境。如果您正在测试数据库设计,然后想要快速截断所有表,应该有一种简单的方法来完成此操作:
DBCC CHECKIDENT({表名},重新生成,0)
*首先使用ID从所有表中删除所有行