使用子查询向表插入多行数据报返回多行错误的解决方法
报错原因
INSERT ... VALUES语法要求每个值位置只能传入单个标量值,你写的两个查询cart_items的子查询会返回用户购物车下所有商品的对应字段,属于多行结果集,不符合VALUES的传参要求,因此触发「SUBQUERY RETURN MULTIPLE ROWS」报错。
修复方案
使用INSERT ... SELECT语法替代INSERT ... VALUES,直接将查询返回的多行结果集批量插入目标表,单条SQL即可满足全量迁移购物车商品条目的需求,修正后的SQL如下:
INSERT INTO ticket_items (ticket_id, ISBN, quantity) SELECT (SELECT COUNT(ticket_id) FROM ticket), ISBN, quantity FROM cart_items WHERE customer_id = 1;
补充说明
- 上述SQL中
ticket_id取值为当前ticket表的总记录数,若你的业务场景需要关联刚生成的特定ticket、或ticket_id为自增字段,请将该子查询替换为实际对应的准确ticket_id,避免数据关联错误 - 该写法会一次性将
customer_id = 1对应的所有购物车商品条目批量插入ticket_items表,无需逐行循环插入,执行效率更高 - 若存在重复插入风险,可在SELECT语句中增加去重逻辑,或通过给目标表加唯一约束的方式拦截脏数据
内容的提问来源于stack exchange,提问作者Fernando Reza Campos
相关产品推荐
相关产品推荐

