1つのINSERT
ステートメントを使用して、テーブルに複数の行を挿入したいと思います。SQLには、単一のINSERT
ステートメントのパラメーターとして複数の行を提供するオプションがあるため、これは問題ありません。現在、これらの行にはID
自動的にインクリメントされるフィールドが含まれています。つまり、その値は私のコードではなくデータベースによって設定されます。
その結果、ID
挿入された行の値を取得したいと思います。私の基本的な質問は、MariaDB / MySQLに対してどのように行うのですか?
結局のところ、これは非常に単純です。たとえばPostgreSQLの場合、PostgreSQLには、1つまたは複数の行に必要な値を返すRETURNING
句がINSERT
あるためです。これはまさに私が望んでいることであり、機能します。
残念ながら、MariaDBもMySQLにもPostgreSQLのRETURNING
句がないため、のようなものにフォールバックする必要がありLAST_INSERT_ID()
ますが、これID
は、単一のを使用して複数の行が挿入された場合でも、最後に挿入された単一の行のを返すだけINSERT
です。すべてのID
値を取得するにはどうすればよいですか?
私のコードは現在次のようになっています:
INSERT INTO mytable
(foo, bar)
VALUES
('fooA', 'barA'),
('fooB', 'barB');
SELECT LAST_INSERT_ID() AS id;
同時書き込みでも機能する方法でこの問題を解決するにはどうすればよいですか?
(いいえ、UUIDフィールドなどに変更するオプションはありません。自動インクリメントフィールドが指定されており、変更できません。)
MySQLとMariaDBにはLAST_INSERT_ID()
関数があり、現在のセッションで最新のINSERTステートメントによって生成されたIDを返します。
ただし、INSERTステートメントが複数の行を挿入すると、生成されたセットの最初のIDがLAST_INSERT_ID()
返されます。
このような複数の行のバッチでは、後続のIDが連続していることを信頼できます。たとえば、MySQLJDBCドライバーはこれに依存しています。
挿入する行にid列のNULL値とNULL以外の値が混在している場合、この仮定を台無しにするリスクがあります。JDBCドライバーは、生成されたIDのセットに対して誤った値を返します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加