一部のモデルの次の空き主キーを知るにはどうすればよいですか?
6 に答える
次に使用可能な主キー値を照会できたとしても、役に立ちません。テーブルをロックしない限り、他のデータベース クライアントが挿入のためにその値を取得する前に、その値を使用することはできません。
代わりに、行を挿入するだけで、現在のセッション中に生成された最新のキー値を照会できます。自動生成された主キーをサポートするすべてのデータベースは、セッション中に挿入された最新のキーを取得する方法を提供します。
「セッション中」の部分は、他のクライアントによって同時に行われる挿入からセッションを保護するため、重要です。それらはキー値を生成でき、セッションは最後に挿入された同じ値を引き続き報告します。
@Stuart Childsは、MySQL が次の ID を生成すると想定MAX(column_name)+1
していますが、これは正しくありません。行を挿入すると、ID 値が生成されるとします。ただし、この挿入、またはその後のDELETE
行をロールバックします。次に挿入すると、MySQL はまったく新しい ID 値を生成します。そのため、ID 値は、現在テーブルに格納されている行に関係なく、クライアントによって生成された最後の ID 値よりも 1 大きくなります。
挿入してもすぐにコミットしない場合も同様です。コミットする前に、他のクライアントが挿入を行います。あなたのセッションと他のクライアントのセッションの両方で、独自の一意の ID 値が生成されます。自動生成された主キーは、一意性を確保するために、トランザクションの分離に関係なく動作します。
自動生成された主キー値は、挿入をまだコミットしていない場合や、挿入をロールバックした場合、または行を削除した場合でも、再利用されたり、複数のセッションに割り当てられたりすることはありません。
カスタムSQLを実行する必要があると思います。必要なSQLはDB固有です。私の知る限り、MySQLでこれを行う信頼できる方法はありません。最後の挿入IDを取得できますが、これはセッション固有です(つまり、DBセッションに挿入した最後のレコードのIDを取得できますが、その後に発生した可能性のある別のセッションの最後のIDは取得できません)。 ただし(そして私が間違っている場合は誰かが私を訂正します)、MySQLはMAX(column_name)+ 1で次のIDを生成するので、同じことができます。
PostgreSQLは、シーケンス操作関数を使用して非常に簡単になります。
編集:
MAX(column_name)+1で生成される複数列キーAUTO_INCREMENT
内の列について考えていたことがわかりました。ただし、元の質問である挿入によって生成される前に次のIDを取得する方法はないという点が依然として残っています。
要素を複製していて、その pk を新しいものに変更して挿入できるようにしたかったため、同じ質問がありました。
私の解決策は次のとおりです。
import copy
objectCopy=copy.copy(object)
objectCopy.pk=None
objectCopy.save()
つまり、save()
それがあなたのためにできるなら、なぜあなたはそれを手動でやりたいのですか?
このスニペットはきっと役に立ちます。