大表删除重复TBO_code数据超时及语法错误问题求助
解决TBO_hotels表重复行删除及LIMIT语法错误问题
一、修复带LIMIT的删除语句语法错误
MySQL中多表DELETE使用LIMIT时,需注意语法规范,正确写法如下:
DELETE t1 FROM `TBO_hotels` t1 JOIN `TBO_hotels` t2 ON t2.TBO_code = t1.TBO_code AND t2.id < t1.id LIMIT 1000;
若仍报错,可换用子查询方式绕开MySQL的表引用限制:
DELETE FROM `TBO_hotels` WHERE id IN ( SELECT id FROM ( SELECT t1.id FROM `TBO_hotels` t1 JOIN `TBO_hotels` t2 ON t2.TBO_code = t1.TBO_code AND t2.id < t1.id LIMIT 1000 ) AS temp );
二、解决大表删除超时(504)问题
一次性删除所有重复行易因数据量过大导致锁表、超时,建议分批循环删除:
方法1:用存储过程自动分批删除
DELIMITER // CREATE PROCEDURE DeleteDuplicateTBOHotels() BEGIN DECLARE row_count INT DEFAULT 1; WHILE row_count > 0 DO DELETE t1 FROM `TBO_hotels` t1 JOIN `TBO_hotels` t2 ON t2.TBO_code = t1.TBO_code AND t2.id < t1.id LIMIT 1000; SET row_count = ROW_COUNT(); END WHILE; END // DELIMITER ; -- 执行存储过程 CALL DeleteDuplicateTBOHotels();
每次删除1000条,直到无重复行可删为止。
方法2:手动分批执行
若无法创建存储过程,可重复执行带LIMIT的删除语句,直到执行后返回的受影响行数为0,即重复行清理完成。
三、优化建议
- 先创建联合索引加速查询:
CREATE INDEX idx_tbo_code_id ON `TBO_hotels`(TBO_code, id);
- 删除完成后添加唯一约束:
ALTER TABLE `TBO_hotels` ADD UNIQUE KEY uk_tbo_code(TBO_code);
内容的提问来源于stack exchange,提问作者Mohib Salahuddin Ayubi
相关产品推荐
相关产品推荐

