2014-02-11 31 views
1

我需要查找表t1中具有唯一(TRAN_ID,CMTE_ID)對的行,其中TRAN_ID和CMTE_ID是兩列。然後我想將這些行插入表uniquesMySQL:如何在MyISAM表中查找具有唯一列值的行?

問題是表uniques似乎最終包含重複對。

注意:表t1是使用InnoDb引擎創建的,然後更新爲使用MyISAM引擎以加快分組和按連接操作。 t1有1.3億行。

這裏是我創建的查詢:

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

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; 

在這一點上,我希望uniques與獨特的行(TRAN_ID填充, 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查詢等效於:

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,反之亦然。由於類型不同,CMTE_ID可能被截斷。

這是一個很好的教訓,爲什麼你應該在總是包含insert語句的列列表。

+0

+1他唯一可以在'uniques'表中得到重複的方法是他在表中已經有數據時插入數據。 –

+0

感謝您的評論。我正在嘗試修復並會報告。 – navidoo

+0

確實是這個問題。謝謝您的幫助! – navidoo

相關問題