2018年1月18日木曜日

MySQLのVALUES関数の(今のところ)唯一の使い道

TL;DR

PostgreSQLの VALUES は引数の表リテラル(行リテラルや列リテラルを含む)をテーブルリファレンスにして返してくれる関数だけれど、MySQLの VALUES は残念ながらそんなことはない。

MySQLのINSERTにおけるVALUESはただのキーワードでVALUES関数ではない。
なのでPostgreSQLみたいに表リテラルからテーブルリファレンスを組み立てる用途には使えない(´・ω・`) < よく言われるやーつだ
ところがどっこい、そのVALUESキーワードとは に、VALUES関数 があって、コイツがまたフツーのVALUES関数ではなくて
INSERT … ON DUPLICATE KEY UPDATE ステートメントでは、UPDATE 句の VALUES(col_name) 関数を使用すると、ステートメントの INSERT 部分からカラム値を参照できます。
というニッチな関数になっている。
つまり、
INSERT INTO t1 (num, val, dt) VALUES (1, 'one', '2018-01-18 12:40:00') ON DUPLICATE KEY UPDATE dt = '2018-01-18 12:40:00';
INSERT INTO t1 (num, val, dt) VALUES (1, 'one', '2018-01-18 12:40:00') ON DUPLICATE KEY UPDATE dt = VALUES(dt);
が等価として扱えるというだけの関数である。
もうちょっと他の名前はなかったのか…。

0 件のコメント :

コメントを投稿