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 回書き出さずにこれを行うにはどうすればよいでしょうか?
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 回書き出さずにこれを行うにはどうすればよいでしょうか?
値を繰り返さなくても、途中まで到達できます。
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
、新しいレコードが新しいキー値を提示する場合、新しいレコードとして挿入されるということです。
新しいレコードに既存のレコードと一致するキー値がある場合、キー違反は無視され、新しいレコードが既存のレコードを置き換えます。
役に立つ場合は、バージョン>= 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)
更新: 列のリストが非常に長い場合、切り捨てられた出力が表示される場合があります。上記のクエリの前にこのステートメントを使用できます ( Uncle irohに感謝します)。
SET SESSION group_concat_max_len = 1000000;