我正在尝试删除表名pincodecheck
中的重复条目,但每当我在phpMyAdmin中运行sql查询时,它会一直显示加载并且没有任何反应。
该表包含大约1,500,000个条目,因此只占表格的一小部分来说明问题。
我正在运行的SQL查询:
DELETE FROM pincodecheck WHERE pinId NOT IN
(SELECT MIN(pinId) FROM (SELECT * FROM pincodecheck) AS tmpTable GROUP BY pincode)
表格结构
pinId pincode deliveryStatus divisionName regionName circleName taluk districtName stateName
146859 700031 Delivery Calcutta South Calcutta West Bengal Kolkata Kolkata WEST BENGAL
146860 700031 Delivery Calcutta South Calcutta West Bengal Kolkata Kolkata WEST BENGAL
146861 700031 Delivery Calcutta South Calcutta West Bengal Kolkata Kolkata WEST BENGAL
答案 0 :(得分:1)
神圣嵌套的SELECT。
首先,删除第三个巢。 DELETE FROM pincodecheck WHERE pinId NOT IN (SELECT min(pinID) from pincodecheck GROUP BY pincode)
应该没问题。
如果您实际上想要在从同一个表中删除时使用tmpTable来存储值,那么实际插入到tmp表中并在子查询中使用它。简单地使用别名并不会做任何事情。
您可能希望将EXPLAIN
放在此查询的前面,看看是否可以识别可能导致返回缓慢的任何步骤。我的猜测是,MySQL将首先获得min(PID)执行子查询,然后使用它来DELETE FROM pincodecheck。
这可能只是一个需要很长时间的情况。如果SELECT min(pinId) FROM pincodecheck GROUP BY pincode
的结果非常大(我假设它们是一个重复数据删除练习),那么它将花费很长时间来使用mysql。它必须在pincodecheck中检查每个单独的记录,以防止从该查询返回的内容。
也许......你能做的就是编写一个查询来获得你想要的最终结果,并使用它来插入一个新表,删除旧表,然后重命名新表以获取它'的地方。类似的东西:
CREATE TABLE <newtable> AS
SELECT *
FROM
pincodecheck main
LEFT OUTER JOIN
(
SELECT pincode, min(pinId) as minPinId
FROM pincodecheck
GROUP BY pincode
) sub ON
main.pincode = sub.pincode and
main.pinId = sub.MinPinId
WHERE
sub.pinCode IS NULL
答案 1 :(得分:0)
基本上,您正在尝试为每个唯一的密码保留MIN(pinId)。
试试这个:
CREATE INDEX idx_pincode ON pincodecheck;
CREATE TABLE pincodecheck_new LIKE pincodecheck;
INSERT INTO pincodecheck_new SELECT MIN(pinId), pincode, deliveryStatus, divisionName, regionName, circleName taluk, districtName, stateName FROM pincodecheck GROUP BY pincode, deliveryStatus, divisionName, regionName, circleName taluk, districtName, stateName;
RENAME TABLE pincodecheck TO pincodecheck_old, pincodecheck_new TO pincodecheck;