MySQL:如何在MyISAM表中查找具有唯一列值的行?

时间:2014-02-11 23:11:50

标签: mysql group-by myisam

我需要找到表t1中具有唯一(TRAN_ID,CMTE_ID)对的行,其中TRAN_ID和CMTE_ID是两列。然后我想将这些行插入到表uniques中。

问题是表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;

我仍然有很长的行列表。发生了什么事?

1 个答案:

答案 0 :(得分: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语句中包含列列表。