我需要找到表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;
我仍然有很长的行列表。发生了什么事?
答案 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
语句中包含列列表。