【问题标题】:Winforms database Id primary key keeps countingWinforms 数据库 Id 主键不断计数
【发布时间】:2020-05-21 15:11:31
【问题描述】:

所以我正在制作一个程序,我可以在其中制作、保存和删除数据库中的项目,但我希望现有项目的 id 能够相互跟进。 例子, 我有这些物品:

|  Id |  Item name  |
----------------------
|  1  |  item 1
|  2  |  item 2
|  3  |  item 3

然后当我删除第 2 项时,我希望它是:

|  Id |  Item name  |
----------------------
|  1  |  item 1
|  2  |  item 3

而不是:

| Id  |  Item name  |
----------------------
|  1  |  item 1
|  3  |  item 3

这是我的表格:

【问题讨论】:

  • 你认为你为什么想要这个?这会导致很多问题,但它会解决什么问题呢?
  • 诸如此类的身份类型 ID 仅意味着唯一 - 不是连续的。当关系数据库中有相关数据时,重新排序是一个主要问题。它们也不意味着具有任何其他内在价值。
  • 我使用 id 作为他们在列表中的位置的参考。我可以换一种方式吗?
  • 通常您不想这样做,但您必须重置身份种子。如果您使用的是 SQL Server,请参阅stackoverflow.com/questions/21824478/…
  • @DaanVandeVoorde:“位置”是一个完全相对的术语。如果没有明确的ORDER BY 子句,则无法保证排序顺序,除非您按Id 排序,否则无论如何它都会乱序。听起来您正在尝试将此值用于不打算达到的目的。你需要这个序列做什么?

标签: c# sql database winforms


【解决方案1】:

但我希望现有项目的 id 能够互相跟进。

所以不要使用身份。简单的。身份不遵循您想要的规则,但是该 MS 的规则已经编程并且它说“一旦给定它就不会被重用”。期间。

RTFM 会告诉您没有再利用的保证。您必须坐下来编写一种方法来获得类似的身份 - 如果您暴露身份,您可能会获得商业明智的所有副作用。以及性能影响。

评论: 我使用 id 作为它们在列表中的位置的参考。

这是一种滥用。如果你想要一个订单,我会有另一个字段,所以你可以重新排序。无论如何,您都需要一个订单(除非您想遵循另一种暗示维持 pk 订单的最坏做法 - 这绝对可以正常工作,直到有一天您的订单发生变化并来到这里,然后您才知道没有保证的订单除非你要一个)。

【讨论】:

    【解决方案2】:

    主键中的数值通常不会这样使用。如果您想要记录的数字顺序,您可以在检索数据时使用此查询

      SELECT 
      ROW_NUMBER() OVER(ORDER BY Id ASC) AS OrderNum,ItemName
      FROM yourTable
    

    然后让主键自动递增并完成它的唯一工作。

    【讨论】:

      猜你喜欢
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 2012-11-04
      • 2011-06-05
      相关资源
      最近更新 更多