MySQL多行INSERT ON DUPLICATE KEY UPDATE中VALUES()弃用的修复方案
MySQL 8.0 多行插入时解决 VALUES() 弃用警告的正确方法
在MySQL 8.0中,VALUES()函数在INSERT...ON DUPLICATE KEY UPDATE场景下已被标记为弃用,单行插入可通过给VALUES子句起别名解决,但多行场景无需给每行单独命名,正确写法是给整个VALUES集合统一设置别名:
INSERT INTO foo (bar, baz) VALUES (1,2), (3,4), (5,6) AS new_foo ON DUPLICATE KEY UPDATE baz = new_foo.baz;
这个写法的核心是:给所有插入行的整体数据源起一个别名(比如new_foo),当触发唯一键冲突时,MySQL会自动关联当前冲突行对应的数据源列值,完全替代原VALUES(baz)的作用,同时不会触发弃用警告。
如果需要更灵活的数据源构造(比如包含计算逻辑、动态生成数据),也可以用INSERT...SELECT结合UNION ALL的方式,给结果集起别名即可:
INSERT INTO foo (bar, baz) SELECT bar, baz FROM ( SELECT 1 AS bar, 2 AS baz UNION ALL SELECT 3, 4 UNION ALL SELECT 5, 6 ) AS new_foo ON DUPLICATE KEY UPDATE baz = new_foo.baz;
这两种方式都能保持多行插入的便捷性,同时彻底解决VALUES()函数的弃用问题。
内容的提问来源于stack exchange,提问作者Hasley
相关产品推荐
相关产品推荐

