ドキュメント
LAST_INSERT_ID()
の場合 言う:
これを知っていると、これを複数のステップからなるプロセスにすることができます。
- 無視を挿入
- LAST_INSERT_ID()の場合、完了(新しい行が挿入されました)
- else SELECT your_primary key FROM yourtable WHERE(挿入されたデータのUNIQUE制約)
米国の州の例:
id | abbrev | other_data
1 | AL | ...
2 | AK |
UNIQUE KEY abbr (abbrev)
次に、新しい行を挿入します:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');
> OK
SELECT LAST_INSERT_ID();
> "3"
// we have the ID, we're done
無視される行を挿入する:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AK','duplicate!');
> OK
SELECT LAST_INSERT_ID();
> "0"
// oops, it already exists!
SELECT id FROM `states` WHERE `abbrev` = 'AK'; // our UNIQUE constraint here
> "2"
// there we go!
または、これを1つのステップで実行するための回避策が考えられます。REPLACE INTO
を使用してください。 INSERT IGNORE INTO
の代わりに -構文は非常に似ています
。ただし、副作用があることに注意してください このアプローチでは、これらはあなたにとって重要な場合と重要でない場合があります:
- REPLACEは行を削除して再作成します
- つまり、DELETEトリガーはトリガーされます
- また、行が存在する場合でもプライマリIDはインクリメントされます
-
INSERT IGNORE
古い行データを保持します、REPLACE
新しい行データに置き換えます