You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

大表删除重复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 22:53:10