web-dev-qa-db-ja.com

mysql:レコードが存在しない場合は挿入し、それ以外の場合はレコードのIDを返します

テーブルに一意の値を挿入する必要があり、レコードのIDが必要であり、リレーションシップテーブルにそれらのIDを挿入する必要があります。存在しない場合はレコードを挿入するクエリが必要です。存在する場合はインセットIDを返し、存在する場合はレコードの主キー(IDを返します)。

オレンジ、マンゴー、バナナなど、バッチ挿入のような複数の値に対してこれを実行したいと思います。

スキーマ:

------------
id | tag   |
------------
1  | orange|
------------

私はこれを単一のレコードで試しました

INSERT INTO `tags` (`tag`) 
SELECT 'myvalue1' 
FROM tags
WHERE NOT EXISTS (SELECT 1 FROM `tags` WHERE `tag`='myvalue1') 
LIMIT 1

いくつかの最適化されたソリューションを理解するための質問を投稿しました。dbの値と一致させるためにコードで余分なループを使用したくありません。

21
Abuzer Firdousi

ドキュメントページに INSERT ... ON DUPLICATE KEY UPDATE の例があります。

クエリは次のようになります。

INSERT INTO `tags` (`tag`) VALUES ('myvalue1')
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), `tag`='myvalue1';
SELECT LAST_INSERT_ID();
14
Marcus Adams

存在しない場合に挿入し、新しい挿入または古いIDを返すmysqlの状態は次のとおりです

    INSERT INTO `tags` (`tag`) 
SELECT 'myvalue1' 
FROM tags
WHERE NOT EXISTS (SELECT id FROM `tags` WHERE `tag`='myvalue1') 
LIMIT 1;
select * from brand where `tag`='myvalue1'
1
Yosra Nagati

MySQLテーブルに挿入するか、存在する場合は更新

これで問題が解決しますか?私はあなたが彼のためにあなたのために働くフォーマットに彼の答えを翻訳すればあなたの問題のほとんどを解決すると思います。

0
Fallenreaper