2014-02-11 7 views
1

고유 한 (TRAN_ID, CMTE_ID) 쌍이있는 테이블 t1의 행을 찾아야합니다. 여기서 TRAN_ID 및 CMTE_ID는 두 개의 열입니다. 그런 다음이 행을 uniques 테이블에 삽입하고 싶습니다.MySQL : MyISAM 테이블에서 고유 한 열 값을 가진 행을 찾는 방법은 무엇입니까?

테이블 uniques은 중복 쌍을 포함하는 것으로 보입니다.

참고 : 테이블 t1은 InnoDb 엔진을 사용하여 생성 된 다음 MyISAM 엔진을 사용하여 그룹화 및 조인 작업의 속도를 높이기 위해 업데이트되었습니다. t1에는 1 억 3 천만 행이 있습니다. 나는 uniques 고유와 행 (TRAN_ID로 채워 기대

LOCK TABLES uniques write, t1 write; 

INSERT INTO uniques 
    SELECT TRAN_ID,CMTE_ID 
      FROM t1 
      GROUP BY TRAN_ID,CMTE_ID 
      HAVING count(*) = 1; 
UNLOCK TABLES; 

을이 시점에서 :

DROP TABLE IF EXISTS uniques; 
CREATE TABLE `uniques` (
    `CMTE_ID` varchar(9) DEFAULT '', 
    `TRAN_ID` varchar(32) DEFAULT '', 
    KEY `TRAN_INDEX` (`TRAN_ID`,`CMTE_ID`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

가 그럼 난 uniques에 삽입 쿼리를 실행하고 :

여기 내 생성 쿼리 CMTE_ID) 쌍으로 구성됩니다. 그러나, 내가 실행할 때

SELECT * FROM uniques 
    GROUP BY TRAN_ID,CMTE_ID 
    having count(*) > 1; 

나는 긴 열의 목록을 얻는다. 무슨 일이야?

답변

2

유니크 방지를 위해 unique 구속을 쌍에 붙일 수 있습니다.

첫 번째 추측은 연산자 오류이거나 테이블에 이미 데이터가 있습니다. 이들을 할인하면 다른 가능성이 있습니다. 필드의 유형은 다음과 같습니다.

`CMTE_ID` varchar(9) DEFAULT '', 
`TRAN_ID` varchar(32) DEFAULT '', 

아마도 이러한 크기가 충분하지 않으므로 데이터가 실제로 테이블로로드 될 때 잘립니다. 이것은 단지 아이디어 일뿐입니다. 귀하의 프로세스는 건전 해 보입니다.

편집 :

실제로 마지막으로 일어난 일이 무엇인지 생각합니다. 열 순서가 다르다는 것을

INSERT INTO uniques(CMTE_ID, TRAN_ID) 
    SELECT TRAN_ID,CMTE_ID 
    FROM t1 
    GROUP BY TRAN_ID,CMTE_ID 
    HAVING count(*) = 1; 

주, 그래서 TRAN_ID 반대의 경우도 마찬가지 CMTE_ID에로드되는 : 귀하의 insert 쿼리에 해당합니다. 유형이 다르므로 CMTE_ID이 잘 렸습니다.

항상insert 문에 열 목록을 포함해야하는 이유에 대한 좋은 교훈입니다.

+0

+1 그는 'uniques' 테이블에서 중복을 얻을 수있는 유일한 방법은 테이블에 이미 데이터가있을 때 데이터를 삽입한다는 것입니다. –

+0

위대한 의견에 감사드립니다. 나는 고치기를 시도하고보고 할 것이다. – navidoo

+0

그게 실제로 문제가되었습니다. 도와 주셔서 감사합니다! – navidoo