2013-01-09 20 views
5

私はAUTO INCREMENTの列を持っているテーブルを持っています。新しい列を挿入するときにこの列の値を取得する必要があります(新しい行の値が必要です)。私はそれについて多くを読んで、さまざまな解決策を見つけました。一つはSELECT LAST_INSERT_ID()です。私はこれについて多くの異なったことを聞いた。私はこれを使用することはできますか?できませんか? SELECT LAST_INSERT_ID()に電話をかけて間違ったIDを取得する前に、別の接続で新しい行が挿入される可能性があります。MYSQL LAST_INSERT_ID()を使用して、挿入された行のIDを取得しますか?

要約すると、SELECT LAST_INSERT_ID()を使用しても安全ですか?そうでない場合は、最後に挿入されたIDを安全な方法で取得するにはどうすればよいですか?

+0

最終挿入IDを使用することができますpreparedStatement.

を使用するようにしてください。他の接続について心配する必要はありません。 –

+0

これを参照してください:http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id –

+2

自動接続プーリングを使用している場合は、別の呼び出しを別の接続。もしあなたがそれを持っていなければ、あなたは安全です。 –

答えて

12

ここで言及しているケースについて心配する必要はないと思います。 MySQLのドキュメントから


接続ごとにサーバ内で維持されて生成されたID。これは、関数が指定されたクライアントに返す値が、そのクライアントによってAUTO_INCREMENT列に影響を与える最新の文のために生成された最初のAUTO_INCREMENT値であることを意味します。この値は、自分自身の値がAUTO_INCREMENTであっても、他のクライアントの影響を受けることはありません。この動作により、各クライアントは、ロックやトランザクションを必要とせずに、他のクライアントのアクティビティを意識することなく、独自のIDを取得できます。彼らは異なった意見を持っている場合は、詳細な情報については

、がthis

を参照してください、私は他の人から読み取るのが大好きです。

0

テーブルの最後のIDを持つことが重要な場合は、テーブルを書き込み用にロックしてからSELECT MAX(id) FROM table_nameにして、テーブルのロックを解除することができます。

0

生成されたIDは接続ごとに発生するため、問題は発生しません。 Thisの記事がより詳細に記載されている。

0

はい、公式ドキュメントによると、それは安全である:

生成されたIDは、接続ごとにサーバーに保持されています。つまり、関数が指定したクライアントに返す値は、そのクライアントがAUTO_INCREMENT列に影響を与える最新の文に対して生成された最初のAUTO_INCREMENT値です。この値は、たとえ自身のAUTO_INCREMENT値を生成したとしても、他のクライアントの影響を受けることはありません。この動作により、各クライアントは、ロックやトランザクションを必要とせずに、他のクライアントのアクティビティを意識することなく、独自のIDを取得できます。

から取ら

:あなたはPDOを使用している場合は、MySQLを使用している場合は、mysqli::$insert_id.

を使用して、はい、これがあるAIを使用しても安全であると、PDO::lastInsertId.

を使用MYSQL Documentation 12.13. Information Functions

関連する問題