2009-02-24 11 views

答えて

17

次の使用可能なプライマリキーの値を照会できても、それは役に立ちません。テーブルをロックしない限り、他のデータベースクライアントが挿入する前にその値を使用することはできません。

代わりに、行を挿入するだけで、最新のキー値がにクエリできます。自動生成された主キーをサポートするすべてのデータベースは、セッション中に挿入された最新のキーを取得する方法を提供します。

「セッション中」の部分は、セッションが他のクライアントによって同時に実行されないようにするため、重要です。彼らはキー値を生成することができ、あなたのセッションは同じ値を報告し続けますそれは最後に挿入されたです。

@Stuart Childs supposes MySQLはMAX(column_name)+1で次のIDを生成しますが、これは間違っています。行を挿入し、ID値が生成されたとします。しかし、この挿入をロールバックするか、その後にその行DELETEをロールバックします。次に挿入すると、MySQLはまったく新しいID値を生成します。したがって、ID値は、どのクライアントによってもによって生成された最後のID値より1大きい値になります。テーブルに現在格納されている行に関係なく。

同様に、挿入してもすぐにコミットしないとします。コミットする前に、他のクライアントが挿入を行います。あなたのセッションと他のクライアントのセッションは、それぞれ固有のID値が生成されます。自動生成された主キーは、一意性を保証するために、トランザクション分離に関係なく動作します。

自動生成された主キー値は、まだ挿入をコミットしていない場合、または挿入をロールバックした場合、または行を削除した場合でも、複数のセッションに再使用または割り当てられません。

+0

ああ、豊富な知識。 –

+0

うわー、このような詳細な説明に感謝します。 – user20955

-1

custom SQLを実行する必要があると思います。必要なSQLはDB固有のものになります。私が知る限り、MySQLでこれを行う信頼できる方法はありません。最後の挿入IDは取得できますが、セッション固有です(DBセッションに挿入した最後のレコードのIDは取得できますが、その後に発生した別のセッションのIDは取得できません)。 しかし、(私が間違っていれば誰かが私を修正します)、MySQLはMAX(column_name)+ 1で次のIDを生成します。

PostgreSQLでは、sequence manipulation functionsを使用するとかなり簡単になります。

編集:

は私がしているはMAX(column_nameに)1で生成されたmulti-column keyAUTO_INCREMENT列を考えていたが判明。しかし、この点は依然として、の前に次のIDを検索する方法がないことを示しています。これは元の質問である挿入物によって生成されます。

+0

なし、IDはMAX(COLUMN_NAME)+1ない.ID。 –

+0

はい、そうです。私はそれを行うマルチユーザーDBのためにかなりbraindeadだろうので、私はチェックしておく必要があります。 –

0

私は要素を複製していたので、これは同じ質問だったので、その要素を挿入できるように新しい要素を変更したかったのです。私が意味する

import copy 
objectCopy=copy.copy(object) 
objectCopy.pk=None 
objectCopy.save() 

save()は、あなたのためにそれをしない理由は、あなたがそれを手動で行いたいならば、次のように

私のソリューションでしたか?

-1

thisスニペットが必ずお手伝いします。

2

-UsingジャンゴとMySQL

NEXT_ID = Table.objects.filter(id__gt = current_id)[0]

関連する問題