중복제거 0 3 472

by 지피지기 [MySQL] [2018.09.13 12:42:55]


안녕하세요. 

이제 막 개발에 입문한 신생아 입니다.

프로그램상에 등록이라는 버튼이 있다고 할때 버튼을 클릭하게되면 자동으로 인서트되도록 프로그램하고있는데요

간혹 중복되어서 인서트가 되는경우가 있습니다. 시간대도 똑같네요 ㅡㅡ

왜이런현상이 있을까요? 

또한 이런 중복된 데이터를 하나만 남기고 삭제하려면 어떻게 해야되는지 조언부탁드려요.

 

select idx, subject, writer from tbl1 where writer='$writer'

--> idx만 증가하고 subject, writer은 모두 같습니다.

idx subject writer wdate
1 aaa 홍길 2018-09-13 00:00:00
2 aaa 홍길 2018-09-13 00:00:00
3 aaa 홍길 2018-09-13 00:00:00
4 bbb 사오 2018-09-13 00:00:00

 

 

by 우리집아찌 [2018.09.13 13:35:04]
-- 삭제전에 SELECT로 검증하세요.

DELETE FROM T 
 WHERE idx IN ( SELECT IDX 
                FROM (SELECT ROW_NUMBER() OVER(PARTITION BY subject,writer,wdate ORDER BY idx ) rn , idx FROM T ) A
               WHERE RN > 1 
               )

 


by 창조의날개 [2018.09.13 13:53:05]


정확한건 소스까지 봐야 알겠지만
wdate의 시간,분,초가 모두 0인것으로 보아
wdate는 datetime 타입이면서 시간,분,초를 넣기 않아서
모두 같은 데이터로 보이는게 아닐까요?

또는 시간대까지 똑같다면 여튼 같은 데이터를 2번 insert한다는건데
그건 프로그램 오류일 가능성이 높습니다.

프로그램을 잘 뜯어(?) 보셔야 할듯.. ^^

 

기존 중복 데이터를 삭제하는 방법은 2가지가 있을 듯 합니다.

1번째 방법으로 데이터가 많은 경우로 직접 테이블까지 생성 할 수 있는 경우


-- 유일한 데이터만 모아서 임시 테이블 생성
create table tbl1_temp
as
select max(idx) idx, subject, writer, wdate
from tbl1 
group by subject, writer, wdate
;

-- 기존 테이블 데이터 삭제
delete from tbl1 ;

-- 임시 테이블 데이터로 원복
insert into tbl1 
select * from tbl1_temp ;

-- 임시 테이블 삭제
drop table tbl1_temp ;


2번째 방법으로 데이터 양이 별로 없는 경우 한방에 해결 (mysql기준)


delete from tbl1
where idx not in (select max(idx)
                    from tbl1 
                   group by subject, writer, wdate)
;

 


by 지피지기 [2018.09.13 14:18:23]

답변감사합니다. 날개님.

근데 프로그램 오류라면 모든 데이터가 중복으로 인서트가 되어야하는건 아닌가요??

어떤 데이터는 중복이고 다른데이터는 한개만 정상적으로 인서트되고... ㅡㅡ 아휴

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입