MySQL中INSERT SELECT批量插入报错‘Operand should contain 1 column(s)’原因咨询
报错原因
你写的多行插入语句里,SELECT ('mycity1', 'mystreerName1', '4855881') 这种写法会把括号里的三个值当成单个复合元组,相当于只返回1列数据,但INSERT语句需要匹配目标表的3列,因此触发“Operand should contain 1 column(s)”的错误。
空表时批量插入多行的正确写法
方法1:用UNION ALL拼接多行(兼容所有MySQL版本)
INSERT INTO `test`.`address_tab1` (`city`,`street_name`,`pincode`) SELECT 'mycity1', 'mystreerName1', '4855881' UNION ALL SELECT 'mycity2', 'mystreerName2', '4855882' UNION ALL SELECT 'mycity3', 'mystreerName3', '4855883' WHERE (SELECT COUNT(*) FROM `test`.`address_tab1`) = 0;
通过UNION ALL把多个单行SELECT的结果合并成多行数据集,每一行的列数和目标表完全对应,再结合WHERE条件,只有表为空时才执行插入。
方法2:用VALUES行构造器(MySQL 8.0及以上可用)
这种写法更简洁,直接构造多行数据:
INSERT INTO `test`.`address_tab1` (`city`,`street_name`,`pincode`) SELECT * FROM ( VALUES ('mycity1', 'mystreerName1', '4855881'), ('mycity2', 'mystreerName2', '4855882'), ('mycity3', 'mystreerName3', '4855883') ) AS temp_table WHERE (SELECT COUNT(*) FROM `test`.`address_tab1`) = 0;
把VALUES构造的多行数据放到子查询中(必须给子查询起别名),再通过SELECT *取出所有列匹配目标表,同时保留空表判断逻辑。
内容的提问来源于stack exchange,提问作者Nazir
相关产品推荐
相关产品推荐

