我所做的是创建一个名为Rent2的临时表来存放我的客户端已注册的所有重复模块,然后在删除临时表之前执行删除内部联接语句。为什么我需要运行这个脚本两次删除所有重复?
但是在完成后总会有剩余的重复。我在这里做错了什么?
CREATE TABLE IF NOT EXISTS `tblRent2` (
`IdRent` INT(11) NOT NULL)
ENGINE = InnoDB;
INSERT INTO tblRent2 (SELECT IdRent FROM tblRent WHERE IdModule = 1 GROUP BY IdClient HAVING COUNT(IdModule) > 1);
INSERT INTO tblRent2 (SELECT IdRent FROM tblRent WHERE IdModule = 2 GROUP BY IdClient HAVING COUNT(IdModule) > 1);
INSERT INTO tblRent2 (SELECT IdRent FROM tblRent WHERE IdModule = 3 GROUP BY IdClient HAVING COUNT(IdModule) > 1);
INSERT INTO tblRent2 (SELECT IdRent FROM tblRent WHERE IdModule = 4 GROUP BY IdClient HAVING COUNT(IdModule) > 1);
INSERT INTO tblRent2 (SELECT IdRent FROM tblRent WHERE IdModule = 5 GROUP BY IdClient HAVING COUNT(IdModule) > 1);
INSERT INTO tblRent2 (SELECT IdRent FROM tblRent WHERE IdModule = 6 GROUP BY IdClient HAVING COUNT(IdModule) > 1);
INSERT INTO tblRent2 (SELECT IdRent FROM tblRent WHERE IdModule = 999 GROUP BY IdClient HAVING COUNT(IdModule) > 1);
DELETE r.* FROM tblRent r INNER JOIN tblRent2 r2 ON
r.idRent = r2.idRent;
SELECT * FROM tblRent2;
DROP TABLE tblRent2;
原始表看起来是这样的:
IdRent | IDClient | IdModule
1 | 30 | 999
2 | 30 | 999
3 | 31 | 1
4 | 31 | 1
这些都是主键。
这些不是*主*键,它们是*外*键(*其他*表的主键)。不过,在重复的情况下,你想删除哪些行? – Bohemian
我知道它们看起来像外键,但是将它们用作主键,其他表存在但不被引用为外键。 (我们希望通过此修补程序进行更正)。 – overmann
我想删除的重复项是IdModule重复项,修复后重复的idClients可以存在,只要它们之间存在不同的模块引用即可。 – overmann