0

我在数据库中创建了一个表,其中包含名为 id 的标识列。当我从该表中删除数据并添加新数据时,id 列仍增加 1,我需要使该列从该表中的最后一个 id 开始增加,而不是删除的那我该怎么办?

这是带有一些记录的datagridview: 在此处输入图像描述

这是删除代码

if (comboBoxdelete.SelectedIndex != -1)
{
    SqlConnection con = new SqlConnection();
    SqlCommand cmd = new SqlCommand();
    con.ConnectionString = "Data Source=MOHAMEDSAFWAT;Initial    Catalog=Card;Integrated Security=True";
    cmd.CommandText = "DELETE FROM [Employee] WHERE [int]=@id1";
    cmd.Connection = con;
    cmd.Parameters.AddWithValue("@id1", comboBoxdelete.SelectedItem);
    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();
    load();
    View();
}
else
{
    MessageBox.Show(" Please Insert  ID First");
}
4

1 回答 1

2

标识列(在 SQL-Sever 中)由 RDBMS 处理。每当您向表中添加一些行时,它都会增加,当删除行时,RDBMS 不会回滚标识列的基础序列。
表的 ID 或主键供应用程序内部使用。通常,您不得将它们显示给用户。
不要将 id 列用作最终用户的行号(因为向用户显示的任何内容都将成为要求更新或删除
的妥协者)顺便说一下,我们需要手动实现 id 列以完全填充您的要求。我们可以使用一个简单的方法:当首先添加任何新行时,我们调用一个 select 来获取新的 id:

SELECT ISNULL(count(*),0)+ 1 as newid from Employee

我们将拥有新的 id。
知道删除场景,认为我们有

Employee1-->id = 1 
Employee2-->id = 2 
Employee3-->id = 3 
Employee4-->id = 4 

现在我们删除Employee2了,需要做什么?
我们需要这样的更新(在检测到要更新的行之后)来满足您的要求:

  Update Employee3 set id = 2 
  Update Employee4 set id = 3

对于表中的所有行!
它在大量数据中不起作用,更新时id是主键,所有子记录也必须更新,重新索引,表锁定和......将是不可避免的。这一切都是因为 id 列正在向用户显示,而您需要按顺序显示。
对于这些场景,请使用另一个非键列Employee-Number或 UI 级别列RowNumber,并且不要向用户显示您的主键。

于 2013-09-28T20:38:30.657 回答