mysql - 如何删除 MYSQL 表上的重复数据以便能够应用唯一值约束
问题描述
我有一个包含一些字段的数据库,我想对表应用唯一值约束:
ALTER TABLE assessment_submissions
ADD CONSTRAINT UC_Question UNIQUE (evaluated_user, evaluator_user, question_id);
但是表中有一些数据不允许我放置这个约束。
尝试应用约束时出现错误:
SQL 错误 1062:键 UC_Question 的重复条目 154-154-45
看看下面的图片:
以 id 131271 和 id 131413 开头的行上的结果在字段evaluated_user
、evaluator_user
和上具有相同的值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;
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 的用户环境,我更喜欢上述方法
推荐阅读
- java - 如何在 Java netbeans 中解决这种性质的启动画面/表单问题
- java - Kafka Streams, Process API 和 Schedule using Key
- c# - 为什么 StringSplitOptions 在 C# 中用 Flags 属性标记?
- python - 当['href']元素是超链接时如何提取href
- javascript - 跨越所有集合的文本搜索
- cypress - Transition 和 Cypress 的意外行为
- android - 如何在 MVVM 架构中使用来自 onActivityResult 的数据?
- html-email - html-emails - 如果我添加图像,电子邮件发送将不起作用
- sql - 从 2 个 case 语句中相互扣除值
- azure-data-factory - Storage Accoung V2 访问防火墙,VNET 到数据工厂 V2