2009-08-16 25 views
23

自動インクリメントされたPKを持つテーブルにデータを挿入するときに、別のステートメントで使用するためにそのキーを取得する必要があります。だから多くの質問が表示されるので、これはPHPでmysql_insert_id()を使って行うことができます。複数の行に最後に挿入されたIDを取得する

しかし、私は一度に複数の行を挿入するように私のインサートを一緒にグループ化しています。私はおそらくいくつかのパフォーマンスの問題があると思ったので、私はこれをした、私は間違っている場合は助言してください。とにかく私が知っている限り、mysql_insert_id()はすべての挿入された行のIDが必要なときに最後のIDだけを返します。

私は私ができる。この場合には推測:

  1. はすべてmysql_insert_id()を使用して、IDS、私が入力した行の数を計算するためにいくつかの簡単な数学を行います。しかし、これは一貫して正しいことが保証されていますか?

  2. 使用する複数の挿入文、各行に1つ

  3. は私のIDの前にしていない使用自動インクリメントを生成します。

これは古典的な問題であるに違いないと確信しています。そのため、最も一般的で推奨されるアプローチが何であるか疑問に思っています。

答えて

2

私が私だったら、私が使用したいのアプローチのカップルがあり、:

はまず、CURRENT_TIMESTAMPメソッドのデフォルトとCreateDateフィールドがあります。基本的にCURRENT_TIMESTAMPを選択して日付を取得し、挿入を実行してからselect id from table where CreateDate > $mytimestampを実行します。

第2に、テーブルにトリガーを作成してafter insertを記録し、新しいIDを小さな監査テーブルに入れることができます。ただし、これらのIDを確認する前にテーブルを切り捨てます。あなたのテーブルが数百万行に及ぶ場合は、このメソッドを使用します。

+0

完全な説明は、 'CURRENT_TIMESTAMP'のアプローチは、私には少し危険なようです。あなたと他の誰かが同じテーブル(同じタイムスタンプ)で同じテーブルに書き込むとどうなりますか? – tonix

32

last_insert_id()を呼び出すと、最後のバッチに挿入された最初の行のIDが返されます。他のすべてが挿入されていれば、連続していることが保証されます

非常に奇妙なことをしない限り、これにより、各行のIDを簡単に十分に調整することができます。

実際、動作はinnodb自動インクリメントモードパラメータの設定によって5.1で異なります。これは問題ではありません。デフォルトから変更しない限り、予想される動作が表示されます。

これは、オンデュプリケートキー更新またはINSERT IGNOREを実行した場合など、期待通りではなく有用でない場合があります。このような場合は、各行のIDを調べるために別の処理を行う必要があります。

ただし、auto-incカラムに値が指定されていない単純なバニラINSERTバッチの場合は、簡単です。どのようにauto-increments are handled in innodb is here

+1

私はInnoDBを想定していました。なぜなら、ほとんどのアプリケーションはInnoDBを使うべきだから、それは最高の汎用エンジンです。 – MarkR

+0

テーブルレベルのロック(メモリ、myisamなど)のエンジンの場合、auto-incは気にする並行性がないため、簡単です。 – MarkR

+0

これは私が「いくつかの数学をする」と思ったことです。カオスはそれが連続的であることが保証されていないと言って間違っていますか?またはおそらく彼は私を誤解しました – zenna

関連する問題