【问题标题】:Deleting primary key from database从数据库中删除主键
【发布时间】:2013-10-09 13:33:24
【问题描述】:

在我的数据库中,我有两个表,OrdersItems。如果我插入两个 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 上的订单时,我会遇到问题,然后程序不知道缺少 ID。当我删除 ID 2 时,我的代码在数据库中仍然只看到一个 ID,并且我再次将“下一个 id”作为 2。但在数据库中是 3。

请求一些指示。谢谢。

【问题讨论】:

  • 您的 ID 是自动编号字段吗?
  • 当您将记录插入数据库时​​,它将为您分配 ID 和订单号(假设这是一个自动编号)。然后您应该查询数据库以找出订单号。在代码中选择订单号并让数据库也这样做会产生冲突
  • 我可以用一些联结表解决这个问题吗?因为我不应该删除主键...

标签: vb.net winforms ms-access


【解决方案1】:

也许您想将其重组为 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

当然,随着订单数量的增加,这可能需要很长时间。如果您必须填写所有订单号,您有点卡住了,否则最简单的方法可能是跳过空白,或将它们标记为已取消的订单。

【讨论】:

    【解决方案2】:

    下一个 id 不一定是最后一个加一,因为正如您所发现的,MS Access 自己管理自动编号列。此外,您还可能在多用户场景中遇到问题,其中两个用户可以选择相同的最后一个键,增加它并最终得到冲突的键。 要确定最后插入的键,请使用以下 SQL 语句:

    SELECT @@IDENTITY
    

    无论您做什么,自动编号或其他方式,删除总是会导致不值得编写代码来填补空白。

    【讨论】:

    • 我应该在使用 INSERT 后选择 @@IDENTITY 吗?当我打开数据库连接并返回 0 时,我只使用 SELECT @@IDENTITY 进行了尝试,无论我的表中有多少项目。
    • 是的。插入之后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多