3

PHPライブラリにadodbを使用しています。

レコードが挿入されたIDを取得するには、この関数を使用します

"$db->Insert_ID()"

データベーステーブルに複数の同時挿入があるかどうかを知りたいのですが、このメソッドは挿入された各レコードの正しい挿入 ID を返しますか?

私がこれを尋ねている理由は、他のレコードをさらに処理し、関連するテーブルに後続のエントリを作成するために、この最後の挿入 ID を使用するためです。

このアプローチは十分に安全ですか、それとも何か不足していますか。

既存のデータを台無しにすることなく、最後の挿入 ID を他のテーブルへの追加の挿入に安全に使用できるように、適切な作業計画を策定するのを手伝ってください。

ありがとう

4

3 に答える 3

10

はい、同時に使用しても安全です。これは、ここでLAST_INSERT_ID()説明されているように、接続ごとであるためです。

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

于 2010-01-23T19:44:52.307 に答える
1

$db->Insert_ID() は最後の挿入 ID のみを返すため、多くのレコードを挿入していて、最後に挿入された各行の ID を取得したい場合、これは正常に機能します。

于 2010-01-23T18:37:16.497 に答える
1

データベーステーブルに複数の同時挿入があるかどうかを知りたいのですが、このメソッドは挿入された各レコードの正しい挿入 ID を返しますか?

最後に挿入された ID のみが返されます。
複数の挿入の ID を取得するにはINSERT_ID()、各ステートメントの実行後に呼び出す必要があります。いいえ:

INSERT INTO TABLE ....
INSERT_ID()

INSERT INTO TABLE ....
INSERT_ID()

...各挿入の id 値を取得します。実行した場合:

INSERT INTO TABLE ....
INSERT INTO TABLE ....
INSERT_ID()

...最後の挿入ステートメントのIDのみを返します。

このアプローチは十分に安全ですか、それとも何か不足していますか。

を使用するよりも安全ですSELECT MAX(id) FROM TABLE。これは、分離レベルに関連するものの中で、他の誰かによって挿入された値を返すリスクがあります。

于 2010-01-23T18:48:53.607 に答える