6

私のアプリケーションでは、多くの外部キーの依存関係があり、多くの場合、多数の行を挿入します。これまで私が行ったことは、一度に1つのインサートを実行し、インサートIDを記録することです。多数の行を挿入する場合、apacheとmysqlが同じサーバーで実行されている場合でも、これには長い時間がかかる傾向があります。

私の質問は、単一のINSERTで複数の行を追加するようにアプリケーションを変更した場合、mysql接続によって返された最後の挿入IDに厳密に基づいて各行のIDを想定できるでしょうか?問題は、一度に複数の人がデータベースに大量の情報を入力する場合があるということです。

私が判断できたところによると、500行を挿入すると、別の接続からのクエリが開始または終了したかどうかに関係なく、挿入IDは(lastInsertID)から(lastInsertID + 499)の範囲になると想定しても問題ありません。完了するまでにかかった時間ですが、これが安全な方法として受け入れられていることを確認したいと思います。

私は主にInnoDBを実行していますが、MyISAMも時々あります。

皆さんありがとう!

-ジャー

4

1 に答える 1

5

mysql_insert_idと現在推奨されている代替mysqli_insert_idは、最後に実行したクエリの影響を受けるテーブルのAUTO_INCREMENT列から最初のエントリIDを返します。

Mysqlでグループ化されたINSERTステートメントは、最初のエントリAUTO_INCREMENTインデックスから繰り返し挿入されます。したがって、はい、単一のINSERTステートメントから挿入されたエントリは連続していると想定しても安全です。

Mysqlリファレンスからのコメント「生成されたIDは、接続ごとにサーバーで維持されます。これは、関数によって特定のクライアントに返される値が、AUTO_INCREMENT列に影響を与える最新のステートメントに対して生成された最初のAUTO_INCREMENT値であることを意味します。この値は、他のクライアントが独自のAUTO_INCREMENT値を生成した場合でも、他のクライアントの影響を受けることはありません。この動作により、各クライアントは、他のクライアントのアクティビティを気にすることなく、またロックやトランザクション。

于 2012-07-03T21:18:07.190 に答える