如何在删除数据库中的行后重新排序ID

时间:2012-11-06 13:11:47

标签: c# sql sql-server database

我使用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();
    }

4 个答案:

答案 0 :(得分:5)

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

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

数据库中存在间隙没有问题。

答案 1 :(得分:2)

当人们死亡时,他们会“重新订购”他们的SSN吗?

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

想象一下,如果你拥有一百万名工人,你会得到的麻烦,以及与之相关的十亿订单。现在,删除Worker no 1.您不仅要重新订购百万工人记录ID,还要重新订购引用工人ID的十亿订单记录。

您遇到的例外可能不是因为“丢失”ID。

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

答案 2 :(得分:1)

您不应该重新订购ID,因为其他表可能会引用此ID 如果ID是可更改的,因此无论如何都是无关紧要的,您可以一起删除此列。

答案 3 :(得分:1)

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

有可能重新设定标识栏的值

DBCC CHECKIDENT('Customer', RESEED, value)

请查看此链接

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