从数据库中删除主键

时间:2013-10-09 13:33:24

标签: vb.net winforms ms-access

在我的数据库中,我有两个表,OrdersItems。如果我插入ID为1和2的两个订单,然后删除第二个订单,那么我的下一个ID将是3.我明白,我也知道我不应该干扰我的表中的主键。但是如果真的没有某种方法可以缩小ID,那么当我删除I​​D 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丢失了。当我删除I​​D 2时,我的代码仍然只在数据库中看到一个ID,并且我再次将“next id”作为2.但是在数据库中是3。

要求一些指示。谢谢。

2 个答案:

答案 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

当然,随着订单数量的增加,这可能会花费很多时间。如果您必须填写所有订单号,那么您可能最容易跳过差距,或将其标记为已取消的订单。