自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL數(shù)據(jù)庫,如何處理重復(fù)的數(shù)據(jù)?

數(shù)據(jù)庫 MySQL
這是一個(gè)基本問題,這篇文章是我很早之前遇到的一種情況,后來在學(xué)習(xí)視頻的時(shí)候又遇到了一次,因此給出一個(gè)總結(jié)。

 [[378476]]

前言

這是一個(gè)基本問題,這篇文章是我很早之前遇到的一種情況,后來在學(xué)習(xí)視頻的時(shí)候又遇到了一次,因此給出一個(gè)總結(jié)。其實(shí)解決能否插入重復(fù)數(shù)據(jù)的問題,一般情況下是有兩個(gè)思路,就像治水一樣,第一個(gè)就是從源頭,第二個(gè)就是在水流經(jīng)的路上。我們帶著這兩種思路繼續(xù)往下看:

問題

在我們的mysql數(shù)據(jù)庫中,經(jīng)常會(huì)出現(xiàn)一些重復(fù)的數(shù)據(jù),有些情況我們?cè)试S重復(fù)數(shù)據(jù)的存在,但有時(shí)候我們也需要?jiǎng)h除這些重復(fù)的數(shù)據(jù)。我們?nèi)绾稳ヌ幚砟?

方法一:防止出現(xiàn)重復(fù)數(shù)據(jù)

也就是說我們?cè)僭O(shè)計(jì)表的時(shí)候,就應(yīng)該對(duì)這些數(shù)據(jù)設(shè)置一個(gè)UNIQUE 索引,在插入的時(shí)候就可以保證其唯一性,也就不存在有重復(fù)的數(shù)據(jù)了。當(dāng)然你也可以直接設(shè)置為PRIMARY KEY(主鍵)。效果也是一樣的。我們看一個(gè)案例:下表中無索引及主鍵,所以該表允許出現(xiàn)多條重復(fù)記錄。

  1. CREATE TABLE student 
  2.     first_name CHAR(20), 
  3.     last_name CHAR(20), 
  4.     sex CHAR(10) 
  5. ); 

目前first_name,last_name是可以重復(fù)的,如果不想重復(fù)這里有兩個(gè)解決辦法:

1、設(shè)置雙主鍵模式

  1. CREATE TABLE student 
  2.    first_name CHAR(20) NOT NULL
  3.    last_name CHAR(20) NOT NULL
  4.    sex CHAR(10), 
  5.    PRIMARY KEY (last_name, first_name) 
  6. ); 

現(xiàn)在就無法插入重復(fù)數(shù)據(jù)了。

2、添加unique索引

  1. CREATE TABLE student 
  2.    first_name CHAR(20) NOT NULL
  3.    last_name CHAR(20) NOT NULL
  4.    sex CHAR(10) 
  5.    UNIQUE (last_name, first_name) 
  6. ); 

這兩種看起來形式好像有一點(diǎn)區(qū)別,但是能起到相同的作用。此時(shí)我們可以插入兩條重復(fù)的數(shù)據(jù),會(huì)發(fā)現(xiàn)報(bào)錯(cuò)。當(dāng)然我們還可以在數(shù)據(jù)庫中去驗(yàn)證一下:

  1. SELECT COUNT(*) as repetitions, last_name, first_name 
  2.        FROM student 
  3.        GROUP BY last_name, first_name 
  4.        HAVING repetitions > 1; 

在這里我們統(tǒng)計(jì)的是 first_name 和 last_name的重復(fù)記錄數(shù),上面已經(jīng)用兩種方法設(shè)置了,這里肯定就是0了。

方法二:在插入時(shí)指定能否插入重復(fù)數(shù)據(jù)

在這里我們使用的是Insert ignore into 與Insert into指令。

(1)Insert ignore into會(huì)忽略數(shù)據(jù)庫中已經(jīng)存在的數(shù)據(jù),如果數(shù)據(jù)庫沒有數(shù)據(jù),就插入新的數(shù)據(jù),如果有數(shù)據(jù)的話就跳過這條數(shù)據(jù)。這樣就可以保留數(shù)據(jù)庫中已經(jīng)存在數(shù)據(jù),達(dá)到在間隙中插入數(shù)據(jù)的目的。

(2)Insert into則直接相反,會(huì)直接插入數(shù)據(jù),不管數(shù)據(jù)庫里面是否含有重復(fù)數(shù)據(jù)。

我們還是舉例說明:

  1. insert ignore into student (last_name, first_name) values ( '張三''李四'); 
  2. //結(jié)果 
  3. Query OK, 1 rows affected (0.00 sec) 
  4. insert ignore into student (last_name, first_name) values ( '張三''李四'); 
  5. //結(jié)果 
  6. Query OK, 0 rows affected (0.00 sec) 

現(xiàn)在我們看出來了吧,也就是說在執(zhí)行第一條插入操作的時(shí)候,看到數(shù)據(jù)庫沒有,則直接插入一條新紀(jì)錄,因此一行記錄受到影響,但是在第二次插入的時(shí)候,數(shù)據(jù)庫已經(jīng)有一條一樣的了,因此便不會(huì)插入了,0行受到影響。

當(dāng)然了還有一個(gè)指令也可以完成類似于insert ignore into相似的功能,那就是replace into。他表示的是如果存在primary 或 unique相同的記錄,則先刪除掉。再插入新記錄。

方法三:過濾重復(fù)數(shù)據(jù)

如果你需要讀取不重復(fù)的數(shù)據(jù)可以在 SELECT 語句中使用 DISTINCT 關(guān)鍵字來過濾重復(fù)數(shù)據(jù)。

  1. SELECT DISTINCT last_name, first_name 
  2. FROM student 
  3. ORDER BY last_name; 
  4. 你也可以使用 GROUP BY 來讀取數(shù)據(jù)表中不重復(fù)的數(shù)據(jù): 
  5. SELECT last_name, first_name 
  6. FROM student 
  7. GROUP BY (last_name, first_name); 

方法四:刪除重復(fù)數(shù)據(jù)

這種情況其實(shí)就相當(dāng)于,在水的終點(diǎn)處去解決??聪旅鎠ql語句:

//根據(jù)student創(chuàng)建一個(gè)臨時(shí)表,并使用group by過濾了重復(fù)數(shù)據(jù)

  1. //根據(jù)student創(chuàng)建一個(gè)臨時(shí)表,并使用group by過濾了重復(fù)數(shù)據(jù) 
  2.  
  3. CREATE TABLE tmp SELECT last_name, first_name, sex 
  4.         FROM student; 
  5.         GROUP BY (last_name, first_name); 
  6. //刪除原student表 
  7. DROP TABLE student; 
  8. //給這個(gè)臨時(shí)表重新命名 
  9. ALTER TABLE tmp RENAME TO stu; 

當(dāng)然你也可以在數(shù)據(jù)表中添加 INDEX(索引) 和 PRIMAY KEY(主鍵)這種簡(jiǎn)單的方法來刪除表中的重復(fù)記錄。方法如下:

  1. ALTER IGNORE TABLE student 
  2. ADD PRIMARY KEY (last_name, first_name); 

OK,解決辦法這么多,相信能解決你的問題。

 

責(zé)任編輯:武曉燕 來源: 愚公要移山
相關(guān)推薦

2024-10-16 17:04:13

2018-09-11 17:13:23

MySQ數(shù)據(jù)庫重復(fù)記錄

2018-04-27 13:00:00

數(shù)據(jù)庫MySQL刪除重復(fù)行

2018-01-24 19:59:03

數(shù)據(jù)庫Oracle壞塊

2011-04-07 15:47:28

MySQL數(shù)據(jù)庫

2010-05-31 15:23:02

MySQL數(shù)據(jù)庫NUL

2022-08-16 14:40:09

SQL數(shù)據(jù)庫內(nèi)存結(jié)構(gòu)

2009-01-11 17:32:03

Oracle數(shù)據(jù)庫重復(fù)數(shù)據(jù)

2010-06-01 17:14:28

2019-08-07 09:52:34

數(shù)據(jù)庫MySQLSQL

2017-10-23 16:06:41

數(shù)據(jù)庫MySQL復(fù)制中斷

2011-07-11 14:36:10

BinlogMysql

2018-01-26 13:28:48

數(shù)據(jù)庫數(shù)據(jù)重復(fù)數(shù)據(jù)庫清理

2013-06-04 09:16:29

Google存儲(chǔ)數(shù)據(jù)

2011-05-24 14:13:20

Oracle數(shù)據(jù)庫

2011-07-12 16:41:14

mysql處理異常

2021-01-25 06:53:59

前端AJAX技術(shù)熱點(diǎn)

2011-07-29 11:20:51

MySQL數(shù)據(jù)庫字段重復(fù)

2010-06-01 12:51:23

MySQL數(shù)據(jù)庫

2011-05-13 09:42:21

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)