如何在INSERT...SELECT...ODKU中用行别名替代已弃用的VALUES()函数?
在带GROUP BY的INSERT...SELECT...ODKU中用行别名替代VALUES()函数的方案
核心问题答案:可以实现,以下是针对你的场景的具体写法和说明:
表结构示例
假设你的表结构如下(实际结构不同可对应调整字段名):
-- 原始数据items表 CREATE TABLE items ( id INT AUTO_INCREMENT PRIMARY KEY, item_type VARCHAR(50), quantity INT ); -- 分组汇总表item_groups,item_type设为唯一索引 CREATE TABLE item_groups ( item_type VARCHAR(50) PRIMARY KEY, total_quantity INT );
历史弃用写法(含警告)
之前使用VALUES()函数的写法会触发弃用警告:
INSERT INTO item_groups (item_type, total_quantity) SELECT item_type, SUM(quantity) FROM items GROUP BY item_type ON DUPLICATE KEY UPDATE total_quantity = VALUES(total_quantity);
替代方案:用子查询别名实现
将分组查询包装为子查询并指定别名,在ON DUPLICATE KEY UPDATE中直接引用该别名的字段,完全替代VALUES():
INSERT INTO item_groups (item_type, total_quantity) SELECT ig.item_type, ig.sum_qty FROM ( -- 子查询做分组聚合,给结果集起别名ig,聚合字段命名为sum_qty SELECT item_type, SUM(quantity) AS sum_qty FROM items GROUP BY item_type ) AS ig ON DUPLICATE KEY UPDATE total_quantity = ig.sum_qty;
关键说明
- 子查询必须指定别名(示例中为
ig),否则无法在更新子句中引用 - 子查询的字段需与
INSERT目标表的字段一一对应,保证列数匹配 item_groups表的item_type必须是唯一索引或主键,这是ON DUPLICATE KEY UPDATE生效的前提- 若需更新多个字段,只需在子查询中添加对应聚合字段,再在更新子句中用
ig.字段名引用即可
内容的提问来源于stack exchange,提问作者snoski
相关产品推荐
相关产品推荐

