web-dev-qa-db-ja.com

ON DUPLICATE KEYを使用して、挿入したいすべてを更新する方法はありますか?

そのキーのレコードが既にある場合、ON DUPLICATE KEY UPDATEを使用して特定の値を更新できることを知っています。

私がすることができます:

INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1, 2, 3)
ON DUPLICATE KEY UPDATE `a`=1, `b`=2, `c`=3

しかし、列と値を2回書き出さずにこれを行うにはどうすればよいですか?

67
Neal

残念ながらありません。

値を繰り返す必要がないため、途中まで到達できます。

INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE `a`=VALUES(`a`), `b`=VALUES(`b`), `c`=VALUES(`c`);

ただし、列をリストする必要があります。

つかいます - REPLACE INTO

の意味 REPLACE INTOは、新しいレコードが新しいキー値を提示する場合、新しいレコードとして挿入されることです。

新しいレコードに既存のレコードと一致するキー値がある場合、キー違反は無視され、新しいレコードは既存のレコードをreplace記録。

38
user319198

便利な場合は、バージョン5.0以上の「重複」クエリの最後の部分を手書きで書かないようにクエリを作成しました。

SELECT GROUP_CONCAT( CONCAT(COLUMN_NAME,"=values(", COLUMN_NAME,")") SEPARATOR ", ") FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'database_name' AND TABLE_NAME = 'table_name';

その出力は次のとおりです。

a=values(a), b=values(b), c=values(c), d=values(d)

列a、b、c、dがあるテーブルでは、クエリの最初の部分に追加できます。

INSERT INTO `tableName` (`a`,`b`,`c`, `d`) VALUES (1,2,3,4) ON DUPLICATE KEY UPDATE a=values(a), b=values(b), c=values(c), d=values(d)

UPDATE:列の非常に長いリストでは、出力が切り捨てられる場合があります。上記のクエリの前にこのステートメントを使用できます(ありがとう ncle iroh ):

SET SESSION group_concat_max_len = 1000000;
12
Javier P

私はこれが古い質問であり、これはやや型破りな答えであることを知っていますが、同じことに遭遇し、別の答えで言及されたgroup_concat_max_lenプロパティの設定に問題があり、常に切り捨てられた結果を得ていました。長いスクリプトを記述するときに最終的に行った別のオプションは、Excelでこの式を使用することでした。

=SUBSTITUTE(TRIM(A1), ",", "") & " = VALUES(" & SUBSTITUTE(TRIM(A1), ",", "") & "),"

a1は、フィールド名をコピーするセルです。これをすばやく行うには、テーブルを右クリックし、selectステートメントをクリップボードにコピーします。これにより、すべての列名が得られ、式によってコンマが削除されます。

これが誰かを助けることを願っています!

0
hyphen