我在数据库中创建了一个名为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");
}
答案 0 :(得分:2)
标识列(在SQL-Sever中)由RDBMS处理。每次向表中添加一行时都会增加,当删除行时,RDBMS不会回滚标识列的基础序列。
表的ID或主键用于应用程序的内部使用。通常,您不得向用户显示它们
不要将id列用作最终用户的行号(因为向用户显示的任何内容都将是要求更新或删除的入侵者)
顺便说一句,我们认为我们需要手动实现id列以完全满足您的需求。
我们可以使用一种简单的方法:首先添加任何新行时,我们调用select来获取新的id:
SELECT ISNULL(count(*),0)+ 1 as newid from Employee
我们将拥有新的身份证明。
知道删除场景,认为我们有
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
之类的其他非关键列或RowNumber
等UI级别列,不要向用户显示主键。