【问题标题】:How can I delete a database record and reuse the deleted primary key?如何删除数据库记录并重用已删除的主键?
【发布时间】:2016-06-22 10:40:18
【问题描述】:

我在 VS 2016 中创建了一个数据库。我还编写了一个 WebApplication (ASP.Net/C#/Entity Framework),我可以在不同的文本框中输入不同的值。这些保存在我的数据库中。每条记录都会收到一个 ID(主键)。

假设我有 5 条 ID 为 1-5 的记录。如果我删除这5个ID后创建一条新记录,新的ID是6,但我希望它重用1的ID。

我怎样才能做到这一点?

【问题讨论】:

  • 为什么会出现这个问题?主键只是一个唯一标识符,仅此而已
  • 您需要以编程方式重置数据库中 ID 列的“身份种子”值。
  • 如果您delete it and then add something new,您可以重复使用 5(但只能使用 5)。 (我之所以添加此评论,是因为我认为我刚刚描述的内容是不可能的,并且它导致了生产站点上的错误,因为我使用我正在评论的问题作为我刚才所说的不可能的证据做。希望这将避免另一个程序员经历同样的事情。)

标签: sql database


【解决方案1】:

我假设您正在使用自动增量为您的 Id 列分配一个新的键值。您假设由于没有记录,因此下一个空闲值将是 1,但它只是从之前的最高值继续递增。

这是一个坏主意,但如果您真的希望回收您的键值,那么您可以关闭自动增量并自己手动管理您的键值,但这容易出错且困难。

你真的需要这样做吗? Int 和 BigInt 可以容纳非常大的数字,您是否可能会用完键值,从而可能需要回收?

如果您只想将自动增量重置回 1 I suggest you look at this post

【讨论】:

    【解决方案2】:

    这不是问题。您的数据库具有身份 (1,1) 的主键。每条新记录的 ID 都会大于添加的最后一条记录。

    如果您要删除所有行,您可以使用

    TRUNCATE TABLE tablename
    

    。 否则,您可能会考虑关闭自动增量并为 ID 提供编号,并提供在您的表中查找 smalles free Id 的功能。

    【讨论】:

      【解决方案3】:

      假设我有 5 条 ID 为 1-5 的记录。如果我删除这5个ID后创建一个新记录,新的ID是6,但它应该是一个。

      您的 id 列似乎是 Identity。每次删除 5 行后,您需要在下面使用 command 以从 1 重新开始您的值

      DBCC CHECKIDENT (yourtable, RESEED, 1);
      

      除非你截断表,否则这不会起作用,因为你在 Id 上有一个主键,所以你需要在你的主键策略上工作

      【讨论】:

        【解决方案4】:

        因为 SQL Server 不会跟踪删除了哪个唯一标识符,所以你只有一个选项可以重置它

        DBCC CHECKIDENT (yourtable, RESEED, 0);
        

        这不是您要查找的,但 SQL Server 不会跟踪哪些被删除。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-04
          • 2021-02-12
          • 1970-01-01
          • 2011-01-18
          • 1970-01-01
          • 2011-02-25
          • 2022-07-06
          相关资源
          最近更新 更多