これは、が提案するソリューションです。 MySQlマニュアル :
exprがLAST_INSERT_ID()の引数として指定されている場合、引数の値は関数によって返され、LAST_INSERT_ID()によって返される次の値として記憶されます。これは、シーケンスをシミュレートするために使用できます:
シーケンスカウンターを保持するテーブルを作成し、初期化します:
mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0);
この表を使用して、次のようなシーケンス番号を生成します。
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1); mysql> SELECT LAST_INSERT_ID();
UPDATEステートメントはシーケンスカウンターをインクリメントし、LAST_INSERT_ID()への次の呼び出しで更新された値を返します。 SELECTステートメントはその値を取得します。 mysql_insert_id()CAPI関数を使用して値を取得することもできます。 23.8.7.37項「mysql_insert_id()」を参照してください。
LAST_INSERT_ID()を呼び出さなくてもシーケンスを生成できますが、このように関数を使用することの有用性は、ID値が最後に自動的に生成された値としてサーバーに保持されることです。複数のクライアントがUPDATEステートメントを発行し、SELECTステートメント(またはmysql_insert_id())を使用して、独自のシーケンス値を生成する他のクライアントに影響を与えたり影響を受けたりすることなく、独自のシーケンス値を取得できるため、マルチユーザーにとって安全です。