【问题标题】:how to re-order IDs after deleting a row in database删除数据库中的行后如何重新排序ID
【发布时间】:2012-11-06 13:11:47
【问题描述】:

我正在使用 C# 制作具有 sql 数据库的程序,在数据库中我有一个名为 Workers 的表,它有一个自动增量和主键 ID_column,当我删除一条记录时,ID 将有彼此之间的差距。

删除记录后我应该如何重新排序 ID?

更新

我要做的是找到记录后在屏幕上显示它, 所以我尝试使用ID 来做到这一点,但由于这些差距,它会产生一些例外!

更新 2

这是我尝试使用的代码

private void btnFind_Click(object sender, EventArgs e)
    {
        string searchFor = "";
        string searchOn = "";
        string searchString = "";
        int results = 0;

        if (searchTextBox.Text.Trim() == "")
            MessageBox.Show("Nothing to search for");

        if (cb1.Text == "Last Name")
        {
            searchFor = searchTextBox.Text.Trim();
            searchOn = "last_Name=";
            searchString = searchOn + "'" + searchFor + "'";
        }

        if (cb1.Text == "Job Title")
        {
            searchFor = searchTextBox.Text.Trim();
            searchOn = "job_Title=";
            searchString = searchOn + "'" + searchFor + "'";
        }

        DataRow[] returnedRows;

        returnedRows = ds1.Tables["Workers"].Select(searchString);

        results = returnedRows.Length;

        if (results > 0)
        {
            DataRow dr1;

            dr1 = returnedRows[0];
            inc = (int)dr1["Worker_ID"]-1;

            NavigateRecords();

        }
        else
        {
            MessageBox.Show("No such Record");
        }

    }

inc是当前显示的记录,NavigateRecords()是显示给定编号inc的记录

void NavigateRecords()
    {
        DataRow dRow = ds1.Tables["Workers"].Rows[inc];

        textBox1.Text =  dRow.ItemArray.GetValue(1).ToString();
        textBox2.Text =  dRow.ItemArray.GetValue(2).ToString();
        textBox3.Text =  dRow.ItemArray.GetValue(3).ToString();
    }

【问题讨论】:

  • 为什么需要?大多数系统都不会打扰,因为没有理由这样做。
  • 伙计们,你的意思是我不必这样做???
  • 主键列不(也不应该)用于排序或任何其他业务逻辑。它只有一个目的:它是标识符。没有理由填补“空白”。
  • 不,您不必重新洗牌。想象一下,如果您的 ID 被其他表用作外键。您打算做什么,调整这些其他表中的 ID?如果您的表有数百万条记录,而您决定删除 ID=1 的记录怎么办?
  • @firas 伙计,只是不要假设它们是连续的(例如,在行中移动时不要使用 +1/-1...)

标签: c# sql sql-server database


【解决方案1】:

通常,出于完整性原因,我们从不更改数据库中的 ID。

在您的情况下,如果出于显示原因,我建议使用 Row_Number

数据库中的间隙没有问题。

【讨论】:

    【解决方案2】:

    当人们死后,他们会“重新排序”他们的 SSN 吗?

    不要做任何事情,不要重新排序。

    想象一下,如果您有 100 万个工人,并且有 10 亿个与此相关的订单,您会遇到什么麻烦。现在,删除 Worker no 1。您不仅需要重新排序百万条工人记录 ID,还需要重新排序引用工人 ID 的十亿条订单记录。

    您遇到的异常可能不是因为“缺少”ID。

    你能发布抛出异常的代码和异常本身吗?

    【讨论】:

      【解决方案3】:

      您不应该对 ID 重新排序,因为其他表可能有此 ID 的引用。
      如果 ID 是可变的,因此在任何方面都无关紧要,您可以将这一列一并删除。

      【讨论】:

        【解决方案4】:

        您要重置标识列的种子值:

        有可能重新设置标识列的值

        DBCC CHECKIDENT('Customer', RESEED, value)
        

        也请查看此链接

        http://geekswithblogs.net/TakeNote/archive/2007/11/30/117258.aspx

        【讨论】:

          猜你喜欢
          • 2016-01-21
          • 2018-11-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-24
          • 2014-08-06
          • 2017-06-17
          相关资源
          最近更新 更多