2012-08-27 2 views
1

id가 아니라 id_str 열로 중복 제품이 포함 된 products 테이블이 있습니다. 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

이 내가 찾아서 중복 삭제하는 것으로 가장 간단한 방법입니다

ALTER TABLE <table_name> ENGINE MyISAM 
: 때문에 InnoDB의 엔진 버그가, 이것에 대한 당신의 MyISAM에 엔진을 변경해야 작동합니다

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

을하고 다시 DB 엔진을 변경 :

그러면 무시 사용하여 DUP의를 찾기 위해 노력하는 열에 고유 인덱스를 추가

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 을보십시오.

참고 :

관련 문제