ID非公開さん
2022/1/5 19:17
2回答
MySQLで「なければINSERT、既存ならIDを取得」を一発で流す書き方はございませんでしょうか? 下記の【値】を【テーブル】に流して、【レスポンス】を得たいイメージです。 【値】
MySQLで「なければINSERT、既存ならIDを取得」を一発で流す書き方はございませんでしょうか? 下記の【値】を【テーブル】に流して、【レスポンス】を得たいイメージです。 【値】 $insert_rows = [ ['kind_id'=>1, 'tag_name=>'冨樫義博'], // 既存 ['kind_id'=>1, 'tag_name=>'神尾葉子'], // ないので挿入 ['kind_id'=>1, 'tag_name=>'ゴン'] // ないので挿入 [※1] ]; 【テーブル】 CREATE TABLE hito( `ID` INT UNSIGNED NOT NULL AUTO_INCREMENT, `kind_id` INT(3), `tag_name` VARCHAR(100), PRIMARY KEY (ID), UNIQUE unique_hito (kind_id, tag_name)); INSERT INTO hito (`ID`, `kind_id`, `tag_name`) VALUES (1, 2, 'ゴン'), (2, 1, '冨樫義博'); 【レスポンス】 $responces = [ [ ['ID'=>2, 'status'=>'get'], ['kind_id'=>1, 'tag_name=>'冨樫義博'] ], [ ['ID'=>3, 'status'=>'insert'], ['kind_id'=>1, 'tag_name=>'神尾葉子'] ], [ ['ID'=>4, 'status'=>'insert'], ['kind_id'=>1, 'tag_name=>'ゴン'] ] ]; [※1] 既存はユニークな unique_hito(kind_id.tag_name) で判定されます。つまり、「ゴン」は tag_name としては既存ですが kind_id 含めればないので、既存扱いされず挿入されます。
ベストアンサー
いわゆる UPSERT(なければINSERT、あればUPDATE)を行う構文は、 MySQLでは INSERT ... ON DUPLICATE KEY UPDATE として実装されています。 https://dev.mysql.com/doc/refman/8.0/ja/insert-on-duplicate.html ですが「なければINSERT、既存ならIDを取得」という成否を返すのか結果セットを返すのかが不定になるような構文が実装されているSQLは寡聞にして不知です(ひょっとしたら実装されているRDBMSがあるのかもしれませんが、そもそも使う場面が想像できない)。 なので、INSERT → 失敗したら ID を取得 が普通じゃないかと思います。 タイミングによってマズイことになるような処理とも思えませんよね?何らかの処理を一文で実装するケースは「タイミングの問題に対応するため」とも言えます。
ID非公開さん
質問者2022/1/5 20:31