我有一个产品表,其中包含列id_str而不是id的重复产品。我们使用id_str来跟踪每个产品。这是我到目前为止所尝试的:
创建临时表并将其截断,然后运行以下查询
INSERT INTO products_temp SELECT DISTINCT id_str, id, title, url, image_url, long_descr, mp_seller_name, customer_rating, curr_item_price, base_item_price, item_num, rank, created_at, updated_at, published, publish_ready, categories, feed_id, category_names, last_published_at, canonical_url, is_curated, pr_attributes, gender, rating, stock_status, uploadedimage_file_name, updated_by, backfill_text, image_width, image_height, list_source, list_source_time, list_category, list_type, list_image, list_name, list_domain, notes, street_date, list_product_rank, created_by from products
然而,当我在新表中搜索重复的id_str:
时,这会移动所有内容SELECT id_str, COUNT(*) C FROM PRODUCTS GROUP BY id_str HAVING C > 1
我得到的结果与原始表格相同。我错过了什么?
答案 0 :(得分:1)
一个或多个其他列导致插入的行是唯一的。 你只是在计数查询中测试id_str,。
答案 1 :(得分:0)
使用SELECT DISTINCT
仅删除重复的整行。如果只有一个值相同而其他值不同,则不会删除行。
假设id
是唯一的,请尝试改为:
INSERT INTO products_temp
SELECT id_str, id, title, url, -- etc
FROM products
WHERE id IN (SELECT MIN(id) FROM products GROUP BY id_str)
答案 2 :(得分:0)
尝试SELECT id_str, COUNT(*) C FROM PRODUCTS_TEMP GROUP BY id_str HAVING C > 1
在您的情况下,您将从原始表中再次选择。
答案 3 :(得分:0)
这是我找到并删除重复项的最简单方法:
注意:由于InnoDB引擎存在错误,为此需要将引擎更改为MyISAM:
ALTER TABLE <table_name> ENGINE MyISAM
然后使用ignore:
为您尝试查找dup的列添加唯一索引ALTER IGNORE TABLE <table_name> ADD UNIQUE INDEX(`<column_name>`)
并改回你的数据库引擎:
ALTER TABLE <table_name> ENGINE InnoDB
如果你想要,你可以删除你刚刚创建的索引,但我建议你也先查看导致重复的原因。