0

私のデータベースには、2 つのテーブルがOrdersありItemsます。ID 1 と 2 の 2 つの注文を挿入してから 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 を 1 つしか認識せず、再び「次の ID」を 2 として表示します。しかし、データベースでは 3 です。

いくつかの指示を求めています。ありがとうございました。

4

2 に答える 2

0

次の id は必ずしも最後の 1 に 1 を加えたものであるとは限りません。これは、MS Access が自動番号列を独自に管理しているためです。さらに、マルチユーザー シナリオでは、2 人のユーザーが同じ最後のキーを選択してインクリメントし、キーが競合するという問題が発生する可能性もあります。最後に挿入されたキーを確認するには、次の SQL ステートメントを使用します。

SELECT @@IDENTITY

自動採番であろうとなかろうと、削除は常にコードを書く価値のないギャップを埋めます。

于 2013-10-09T13:50:13.073 に答える