工作中遇到這麼個需求,有個 eh 表沒有唯一索引,當表中有一大堆資料後,又需要建個唯一索引,而這個表中還很多重複值,問我咋辦?
一句話形容就是:表中重複值太多,如何去重。
舉個白痴例子:
1. 建表a: create table a(id int,name char(10));
2. 插入資料:
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | a |
| 3 | a |
| 3 | a |
| 3 | a |
+------+------+
3. 在id列上需要建唯一索引,如何去重?
方法1:
mysql5.6及一下版本(看好,是低版本,5.5,5.6等)中,有個修改表結構的語法,語句如下:
alter ignore table a add unique key uk_id(id);
它的原理是:重建一張表,加上唯一索引,然後再往新建的表中導資料,遇到重複的列直接刪除。
原理很簡單,用起來也很方便,缺點是容易造成主從資料不一致,難道還在使用古老的binlog_format。另外就是,原理畢竟是重建表,在對大表操作中,很容易造成長時間的鎖表。
不管什麼原因,5.7之後這種語法就被直接拋棄了。
方法2:
根據方法1的原理,自己寫個sql執行,豈不痛快。
1. 建表加索引:create table b(id int primary key,name char(10)) ;
2. 插入資料,有重複的replace: replace into b select * from a;
3. 重新命名:drop table a; rename table b to a;
ok還有很多其它去重方法,比如重複資料很少時,查出來,刪除。
不寫了,寫不下去了。。。
Mysql刪除表中重複資料
一張表中有重複資料,需要刪除重複的資料,只保留 最大 最小 一條。例 現有a表 id 主鍵 唯一 b 資料 有重複 需求 刪除表中重複的資料,保留相同資料中id最小的資料。效果 sql思路 先查詢出去重過後的id 可用分組 再刪除其它id的資料 delete from a where id not ...
刪除list中重複的值
方法一 迴圈元素刪除 刪除arraylist中重複元素 public static void removeduplicate list list system.out.println list 方法二 通過hashset剔除 刪除arraylist中重複元素 public static void r...
刪除MySQL中的重複
今天遇到刪除表中重複的問題。pid為主鍵,但想要刪除menuid相同重覆記錄。剛開始想到的語句是 delete from qb product where id not in select id min id from qb product group by menuid 但mysql不肯幹,you...