QAH*_*QAH 6 sql-server database-design identity
我正在创建一个存储联系人的SQL数据库.我希望能够删除联系人,并且每个联系人的正确ID对于我连接到它的软件至关重要.让我们说我有联系詹姆斯,他是第一个.他的身份证是0.我加上玛丽,她的身份证是1.如果我删除詹姆斯,玛丽的身份证如何设置为0而不是1?它必须重置,因为她现在是第一个.换句话说,当有人被删除时,如何重置数据库中的所有ID?谢谢
Jos*_*rke 16
这在很多方面都是一个坏主意.我正在辩论是否应该告诉你如何做到这一点.一旦设置了行的标识,就永远不应该有理由改变它的标识.
如果您有可能使用错误的字段作为PK标识符.我在这里假设您正在谈论您的PK字段,这也是一个标识列.
请记住,如果您创建链接到联系人表的任何表,并且您开始更改您的ID,则还需要更新所有这些表.这将变得昂贵......
一旦你在数据库中拥有超过一小部分记录,这将变得非常缓慢.标识列不适合你,你需要做一些自定义的tsql来改变所有数字 - 但是一个非常糟糕的主意,imo.
如果您需要跟踪添加的订单,为什么不使用日期/时间戳.
你需要重新思考你的设计.
这不是ID如何工作,而不是它们应该如何工作.ID永远不会改变,或者所有链接的信息都指向错误的行.
相反,为什么不添加您控制的"External_ID"列?或者在查询中动态编号(使用计算列?)
在自动递增主键列上执行此操作是没有意义的,即使这样做很简单,如果没有相关表中的大量更新,您也会影响数据完整性。为此,您可能需要从列中删除索引和主键约束(此时您的应用程序可能会崩溃),对所有后续记录重新编号,对所有相关表重新编号,然后重新应用主键约束和索引。
如果您确实必须拥有某种形式的线性标识符,该标识符始终从 0 开始(这可能表明软件设计存在问题),那么除了主键之外,您还可以拥有辅助 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];
Run Code Online (Sandbox Code Playgroud)
我强烈反对这种做法 - 如果您的 ID 由于删除记录而“丢失”值,则软件应该测试这些值是否存在,而不是仅仅删除。
归档时间: |
|
查看次数: |
9363 次 |
最近记录: |