共計 2816 個字符,預計需要花費 8 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章將為大家詳細講解有關 MySQL 怎么消除重復行,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
sql 語句
/*
MySQL 消除重復行的一些方法
---Chu Minfei
---2010-08-12 22:49:44.660
-- 引用轉載請注明出處:http://blog.csdn.NET/feixianxxx
---------------- 全部字段重復 ------------------------
-- 1 使用表替換來刪除重復項
create table test_1(id int,value int);
insert test_1 select 1,2 union all select 1,2 union all select 2,3;
-- 建立一個和源表結構一樣的空的臨時表
create table tmp like test_1;
-- 向臨時表插入不重復的記錄
insert tmp select distinct * from test_1;
-- 刪除原表
drop table test_1;
-- 更改臨時表名為目標表
rename table tmp to test_1;
-- 顯示
mysql select * from test_1;
+------+-------+
| id | value |
+------+-------+
| 1 | 2 |
| 2 | 3 |
+------+-------+
--2. 添加 auto_increment 屬性列 (這個方法只能用于 MyISAM 或者 BDB 引擎的表)
create table test_1(id int,value int) engine=MyISAM;
insert test_1 select 1,2 union all select 1,2 union all select 2,3;
alter table test_1 add id2 int not null auto_increment,
add primary key(id,value,id2);
select * from test_1;
+----+-------+-----+
| id | value | id2 |
+----+-------+-----+
| 1 | 2 | 1 |
| 1 | 2 | 2 |
| 2 | 3 | 1 |
+----+-------+-----+
delete from test_1 where id2 1;
alter table test_1 drop id2;
select * from test_1;
+----+-------+
| id | value |
+----+-------+
| 1 | 2 |
| 2 | 3 |
+----+-------+
------------------- 部分字段重復 ---------------------
--1. 加索引的方式
create table test_2(id int,value int);
insert test_2 select 1,2 union all select 1,3 union all select 2,3;
Alter IGNORE table test_2 add primary key(id);
select * from test_2;
+----+-------+
| id | value |
+----+-------+
| 1 | 2 |
| 2 | 3 |
+----+-------+
我們可以看到 1 3 這條記錄消失了
我們這里也可以使用 Unique 約束 因為有可能列中有 NULL 值,但是這里 NULL 就可以多個了..
--2. 聯合表刪除
create table test_2(id int,value int);
insert test_2 select 1,2 union all select 1,3 union all select 2,3;
delete A from test_2 a join (select MAX(value) as v ,ID from test_2 group by id) b
on a.id=b.id and a.value b.v;
select * from test_2;
+------+-------+
| id | value |
+------+-------+
| 1 | 3 |
| 2 | 3 |
+------+-------+
--3. 使用 Increment_auto 也可以就是上面全部字段去重的第二個方法
--4. 容易錯誤的方法
-- 有些朋友可能會想到子查詢的方法,我們來試驗一下
create table test_2(id int,value int);
insert test_2 select 1,2 union all select 1,3 union all select 2,3;
delete a from test_2 a where exists(select * from test_2 where a.id=id and a.value value);
/*ERROR 1093 (HY000): You can t specify target table a for update in FROM clause*/
目前,您不能從一個表中刪除,同時又在子查詢中從同一個表中選擇。
------------------ 刪除特定重復行 --------------
-- 主要通過 order by +limit 或者直接 limit
create table test_3(id int,value int);
insert test_3 select 1,2 union all select 1,3 union all select 1,4 union all select 2,3;
-- 這是要保留 ID=1 value 最小的那個記錄,刪除其他 id 為的記錄
delete from test_3 where id=1 order by value desc limit 2;
select * from test_3;
+------+-------+
| id | value |
+------+-------+
| 1 | 2 |
| 2 | 3 |
+------+-------+
如果你只想刪除任意的記錄 保留一條 就可以去掉 order by
關于“MySQL 怎么消除重復行”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
向 AI 問一下細節
正文完