如何从Magento 2 MySQL数据库的CSV字段中去除重复值
处理Magento 2 MySQL中CSV格式ID列表的重复值问题
可以通过自定义MySQL函数实现CSV列表的去重,再批量更新数据,具体步骤如下:
1. 创建去重函数
先创建一个用于拆分CSV、去重后重新合并的函数:
DELIMITER // CREATE FUNCTION deduplicate_csv(csv_text VARCHAR(255)) RETURNS VARCHAR(255) DETERMINISTIC BEGIN DECLARE result VARCHAR(255) DEFAULT ''; DECLARE current_id VARCHAR(10); DECLARE remaining_text VARCHAR(255) DEFAULT csv_text; -- 清理末尾多余的逗号 IF RIGHT(remaining_text, 1) = ',' THEN SET remaining_text = LEFT(remaining_text, LENGTH(remaining_text) - 1); END IF; WHILE LENGTH(remaining_text) > 0 DO -- 提取单个ID IF INSTR(remaining_text, ',') > 0 THEN SET current_id = LEFT(remaining_text, INSTR(remaining_text, ',') - 1); SET remaining_text = RIGHT(remaining_text, LENGTH(remaining_text) - INSTR(remaining_text, ',')); ELSE SET current_id = remaining_text; SET remaining_text = ''; END IF; -- 仅添加未在结果中出现过的ID IF INSTR(CONCAT(',', result, ','), CONCAT(',', current_id, ',')) = 0 THEN SET result = IF(result = '', current_id, CONCAT(result, ',', current_id)); END IF; END WHILE; RETURN result; END // DELIMITER ;
2. 批量更新数据
假设存储属性的表是catalog_product_entity_varchar(Magento 2默认产品属性表),执行更新语句:
UPDATE catalog_product_entity_varchar SET `value` = deduplicate_csv(`value`) WHERE attribute_id = 145 AND store_id = 0;
注意事项
- 操作前必须备份数据库,防止数据意外丢失
- 如果你的
value字段长度超过255,需同步调整函数中VARCHAR的长度(比如改为VARCHAR(1024)) - 若ID的长度超过10,需调整函数中
current_id的定义长度 - 更新后可执行以下语句验证结果:
SELECT value_id, entity_id, `value` FROM catalog_product_entity_varchar WHERE attribute_id = 145 AND store_id = 0;
内容的提问来源于stack exchange,提问作者Michael Meyer
相关产品推荐
相关产品推荐

