MySQL 에서 중복데이터가 있는 컬럼들에 unique index 만들기.

망치의 이미지

컬럼 몇개를 조합해서 unique index 로 잡으려고 하는데 이미 중복 데이터가 많이 들어가 있는 상태라
중복데이터를 먼저 정리해야 하는 상황입니다.

근데 이게 데이터가 많다보니 하나하나 찾아내서 중복되는것들을 삭제하면서 시도하려니 시간이 너무 오래걸리네요.. DB 부하 자체도 심하구요.

간단히 중복데이터들은 유일하게 한 행만 남기도록 하고, unique index 를 생성할 방법 없을까요?

망치의 이미지


큐브리드 게시판에 비슷한 논의가 있네요
http://www.cubrid.com/zbxe/?mid=bbs_developer_qa&page=3&document_srl=45181&sort_index=readed_count&order_type=desc

참고해봐야겠슴다

---------------------------------------
http://www.waitfor.com/

---------------------------------------
http://www.waitfor.com/
http://www.textmud.com/

송효진의 이미지

빈 테이블을 만들고 unique index 를 미리 건 후
insert into newtable select * from oldtable;
하면 되지 않을까요?

혹시 중복시 거기서 그냥 멈춰버린다면,
해당 테이블을 덤프 떠서 INSERT 문으로 만들어주면 될겁니다.

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇 개 안돼요~
http://xenosi.de/

망치의 이미지

mysqldump 로 원본 테이블의 덤프를 떠서 덤프파일에서 중복된 값을 제거한 뒤 INSERT 하라는 말씀이신가요?

중복시 멈춰버린다면.. 까지는 이해가 되는데 해당 테이블을 떠서 INSERT 문으로 만들라는게 잘 이해가 안되서요;

mysqldump 를 이용해서 INSERT 문으로 된 SQL 파일 까지는 만들었는데 이걸 어떻게 해야 할지 모르겠어요.

---------------------------------------
http://www.waitfor.com/

---------------------------------------
http://www.waitfor.com/
http://www.textmud.com/

망치의 이미지

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

Quote:
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX `name` (`one_id`, `two_id`, `content`(64));

위 페이지에서 저런걸 찾았습니다.
중복값이 있더라도 일단 인덱스 생성이라도 강제로 하게 만드는 방법이 있네요.

---------------------------------------
http://www.waitfor.com/

---------------------------------------
http://www.waitfor.com/
http://www.textmud.com/

송효진의 이미지

unique index 가 이미 걸려 있으면 중복값이 있어도 insert 되지 않고 다음으로 넘어갈거라는 것입니다.

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇 개 안돼요~
http://xenosi.de/

망치의 이미지

해봤는데 중복값이 있으니까 INSERT 중에 그냥 멎어버리더라구요.
일단 위 방법대로 강제로 인덱스를 넣어둔상태에서 기존 중복데이터는 ... 흠.. 추후 처리 예정...입니다 ㅡ.,ㅡ; 신규 데이터에 대해서 일단은 중복 방지 대책이 만들어졌으니;;

---------------------------------------
http://www.waitfor.com/

---------------------------------------
http://www.waitfor.com/
http://www.textmud.com/

singularof의 이미지

select로 가져올때

select distinct 컬럼 from 테이블 하시면 될거 같은데.. 중복된자료는 하나만 띄어주는거요..

망치의 이미지

일단.. distinct 는 컬럼 하나만 가능한지라 좀 힘들것같아요

---------------------------------------
http://www.waitfor.com/

---------------------------------------
http://www.waitfor.com/
http://www.textmud.com/

김동수의 이미지

이렇게 하면 되겠네요.

select * from table1 as aa
where NOT EXISTS
(select * from (select col1, col2, ..... from (select * from table1 order by col2 desc) a group by col1) as bb where aa.col1=bb.col1 and aa.col2=bb.col2 and ..... )

이 쿼리는 col1 값을 기준으로 제일 큰 col2 값을 제외한 나머지 결과만 가지고 오는 쿼리입니다.
즉, 제일 위의 select 를 delete 로 바꾸는 것으로, col1 기준으로 중복값을 하나만 남기고 모조리 삭제가 가능하죠 ^^;
큐브리드 쿼리는 큰 도움이 되지 않을것입니다.. 큐브리드 전용 쿼리라서요...
당연한 소리지만, 위 쿼리도 group by 의 mysql 특성(^^)을 이용한 쿼리라서 다른 DBMS에서 적용은 어려울것입니다.

-------------------------------------
김동수 - Prototype for Evolution

김동수 - Prototype for Evolution

망치의 이미지

select * from table1 as aa
where NOT EXISTS
(
   select * from 
   (
      select col1, col2, ..... from 
      (
         select * from table1 order by col2 desc
      ) a group by col1
   ) as bb where aa.col1=bb.col1 and aa.col2=bb.col2 and ..... 
)

감사합니다.
아직 실행은 못시켜봤는데.. 말씀하신 mysql 의 group by 의 특성이 어떤건가요?

---------------------------------------
http://www.waitfor.com/

---------------------------------------
http://www.waitfor.com/
http://www.textmud.com/

송효진의 이미지

원래 group by 를 하면 grouping 되지 않은 필드는 선택할 수 없습니다.

I J

1 a
1 b
2 c
2 d
3 e
3 f

select I, J from table group by I
하면 J 에 어느게 오게 될지 명확하지 않아서 안되는 거죠.
근데 MySQL 은 됩니다.-_-;

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇 개 안돼요~
http://xenosi.de/

망치의 이미지

그렇군요!
감사합니다. ㅎㅎㅎㅎ

---------------------------------------
http://www.waitfor.com/

---------------------------------------
http://www.waitfor.com/
http://www.textmud.com/

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.