在MySQL中能否先使用WITH创建数据集再执行INSERT操作?
MySQL中INSERT结合WITH CTE的可行性
这种操作是可行的,但仅支持MySQL 8.0及以上版本——因为MySQL直到8.0版本才正式引入CTE(公共表表达式)语法。
代码语法说明
你提供的SQL代码语法本身是正确的,如果运行报错,优先检查你的MySQL版本:
SELECT VERSION();
如果版本低于8.0,就会出现不支持WITH子句的错误。
低版本MySQL的替代方案
如果你的MySQL版本不足8.0,可以用以下两种方式实现相同逻辑:
方案1:使用临时表
-- 创建临时表存储Excel数据 CREATE TEMPORARY TABLE stuff ( external_sku VARCHAR(50), retailer VARCHAR(50), sku VARCHAR(50), cat VARCHAR(50), sub_cat VARCHAR(50) ); INSERT INTO stuff VALUES ('1005-BASE-BLACK', 'PMD WEBSITE', '1005-Base-Black', 'ACCESSORIES', 'Charging Stand'); -- 执行插入(先校验数据是否存在) INSERT INTO retail_to_internal_sku(retailer, retail_sku, internal_sku, date_added) SELECT s.retailer, s.external_sku, s.sku, CURDATE() FROM stuff s WHERE NOT EXISTS ( SELECT * FROM retail_to_internal_sku r WHERE r.internal_sku = s.sku AND r.retail_sku = s.external_sku AND r.retailer = s.retailer ); -- 清理临时表 DROP TEMPORARY TABLE IF EXISTS stuff;
方案2:直接嵌套子查询
INSERT INTO retail_to_internal_sku(retailer, retail_sku, internal_sku, date_added) SELECT s.retailer, s.external_sku, s.sku, CURDATE() FROM ( -- 直接将Excel数据作为子查询 SELECT '1005-BASE-BLACK' AS external_sku, 'PMD WEBSITE' AS retailer, '1005-Base-Black' AS sku, 'ACCESSORIES' AS cat, 'Charging Stand' AS sub_cat ) s WHERE NOT EXISTS ( SELECT * FROM retail_to_internal_sku r WHERE r.internal_sku = s.sku AND r.retail_sku = s.external_sku AND r.retailer = s.retailer );
内容的提问来源于stack exchange,提问作者canada48978
相关产品推荐
相关产品推荐

