2012-08-27 15 views
1

我有一個產品表,其中包含id_str列而非id列的重複產品。我們使用id_str來跟蹤每個產品。這是我試過到目前爲止:無法刪除mysql中的重複記錄

創建一個臨時表,並截斷它,然後跑下面的查詢

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

這是我發現找到並刪除重複的最簡單的方法:

注意:由於InnoDB引擎中的一個錯誤,這個工作你需要你的引擎更改爲MyISAM數據:

ALTER TABLE <table_name> ENGINE MyISAM 

然後添加一個唯一索引列你正在努力尋找DUP在使用忽視:

ALTER IGNORE TABLE <table_name> ADD UNIQUE INDEX(`<column_name>`) 

,改變你的數據庫引擎回:

ALTER TABLE <table_name> ENGINE InnoDB 

如果你想要的話,你可以刪除你剛創建的索引,但是我建議你也要看看是什麼原因導致了重複。

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) 
1

一個或多個其它塔的使被插入的行是唯一的。 您只是在計數查詢中測試id_str。

0

嘗試SELECT id_str, COUNT(*) C FROM PRODUCTS_TEMP GROUP BY id_str HAVING C > 1

在你的情況你是從原始表再次選擇。