在我的数据库中,我有两个表,Orders
和Items
。如果我插入ID为1和2的两个订单,然后删除第二个订单,那么我的下一个ID将是3.我明白,我也知道我不应该干扰我的表中的主键。但是如果真的没有某种方法可以缩小ID,那么当我删除ID 2然后下次当我向我的数据库添加一些订单时,我会想要将它放在ID 2上,那么是什么让我感到烦恼呢?自动编号然后下降或者?
我可能做错了,因为我在这个函数中得到了我的订单:
Private Sub GetLastOrderID()
Try
sqL = "SELECT ID FROM Order ORDER BY ID Desc"
ConnDB()
cmd = New OleDbCommand(sqL, conn)
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
'next id in database is current + 1
If dr.Read = True Then
txtOrderID.Text = dr("ID") + 1
Else
txtidnarocila.Text = 1
End If
Catch ex As Exception
MsgBox(ex.Message)
Finally
cmd.Dispose()
conn.Close()
End Try
End Sub
所以一般来说,当我删除某些ID上的Order时会出现问题,然后程序不知道ID丢失了。当我删除ID 2时,我的代码仍然只在数据库中看到一个ID,并且我再次将“next id”作为2.但是在数据库中是3。
要求一些指示。谢谢。
答案 0 :(得分:0)
下一个id不一定是最后一个加一个,因为正如您所发现的那样,MS Access自己管理自动编号列。此外,您还可能在多用户方案中遇到问题,其中两个用户可以选择相同的最后一个密钥,增加它并最终使用冲突的密钥。 要确定最后插入的密钥,请使用以下SQL语句:
SELECT @@IDENTITY
无论你做什么,自动编号或其他方式,删除都会造成不值得编写代码的空白。
答案 1 :(得分:0)
也许您想将其重组为getNextOrderId()而不是:
Private Sub GetLastOrderID()
int currentId = 0
Try
sqL = "SELECT ID FROM Order ORDER BY ID"
//Stripped out connection handling
//execute SQL
while (dr.Read = True) {
txtOrderID.Text = dr("ID")
if (txtOrderID.Text > currentId +1)
txtOrderID.Text = currentId + 1
break
else
currentId++
}
End Try
End Sub
当然,随着订单数量的增加,这可能会花费很多时间。如果您必须填写所有订单号,那么您可能最容易跳过差距,或将其标记为已取消的订单。