mysql 數(shù)據(jù)庫去掉指定字段重復(fù)的數(shù)據(jù)
問題背景:
目前遇到一個(gè)問題需要進(jìn)行數(shù)據(jù)的去重。
name | sex | address | |
---|---|---|---|
tony | man | tony@xxx.com | dalian |
tony | man | tony@xxx.com | dalian |
現(xiàn)在想要name字段上加上主鍵。這就需要沖掉重復(fù)的值。目前采用的方式可以如下
創(chuàng)建表的sql為
create table customers(
`name` varchar(30),
sex varchar(5),
email varchar(50),
address varchar(100)
);
造數(shù)據(jù)
insert into customers values ('tony','man','tony@xxx.com','dalian');
insert into customers values ('tony','man','tony@xxx.com','dalian');
需要將name字段定義為主鍵
如果將name字段定義為主鍵菜枷,那么問題來了,name字段有重復(fù)的怎么整叁丧?首先需要去掉重復(fù)值啤誊。
我們可以通過臨時(shí)表的方式進(jìn)行處理。
- 我們可以通過一個(gè)變量增加一個(gè)字段來做表的唯一標(biāo)識(shí)
set @rownum =0;
select @rownum:=ifnull(@rownum,0)+1 as rownum , c.*from customers c;
- 用上面的方式創(chuàng)建一張臨時(shí)表
set @rownum =0;
create table customers_temp select @rownum:=ifnull(@rownum,0)+1 as rownum , c.*from customers c;
- 執(zhí)行查看臨時(shí)表的數(shù)據(jù)
select * from customer_temp;
rownum | name | sex | address | |
---|---|---|---|---|
1 | tony | man | tony@xxx.com | dalian |
2 | tony | man | tony@xxx.com | dalian |
- 我們可以直接將customer_temp表中的數(shù)據(jù)刪掉拥娄。
Delete from customers_temp Where rownum Not In (Select Max(t.rownum) From (select * from customers_temp ) t Group By `name`);
為什么在子查詢中又增加了一層子查詢蚊锹,如果不加會(huì)報(bào)錯(cuò)1093
現(xiàn)在我們只是剩下了rownum最大的一條,剩下的步驟稚瘾,我們可以刪掉之前的表牡昆,然后將customers_temp 重命名為customers即可。
drop table customers;
RENAME TABLE customers_temp TO customers;