首页 > 解决方案 > 如何删除 MYSQL 表上的重复数据以便能够应用唯一值约束

问题描述

我有一个包含一些字段的数据库,我想对表应用唯一值约束:

ALTER TABLE assessment_submissions
ADD CONSTRAINT UC_Question UNIQUE (evaluated_user, evaluator_user, question_id);

但是表中有一些数据不允许我放置这个约束。

尝试应用约束时出现错误:

SQL 错误 1062:键 UC_Question 的重复条目 154-154-45

看看下面的图片:

具有重复结果的 Sql

以 id 131271 和 id 131413 开头的行上的结果在字段evaluated_userevaluator_user和上具有相同的值question_id

这样就不可能应用约束。

我删除了重复的行,但我仍然无法应用约束。

我想该表中有更多重复的数据。如何找到该表中重复的所有数据?我可以使用哪个查询来做到这一点?

我不知道我可以从哪里开始。

标签: mysqlsqlduplicates

解决方案


请根据手头的需要使用这两个中的任何一个。本质上,您需要决定是保留最先到达数据库的重复集还是最后到达的集。

DELETE t1 FROM assessment_submissions t1 INNER JOIN assessment_submissions t2 
WHERE t1.id < t2.id 
AND t1.evaluated_user=t2.evaluated_user AND t1.evaluator_user = t2.evaluator_user 
AND t1.question_id=t2.question_id;
DELETE t1 FROM assessment_submissions t1 INNER JOIN assessment_submissions t2 
WHERE t1.id > t2.id 
AND t1.evaluated_user=t2.evaluated_user AND t1.evaluator_user = t2.evaluator_user 
AND t1.question_id=t2.question_id;

对于 MySQL 版本早于 8.X 的用户环境,我更喜欢上述方法


推荐阅读