溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mysql數(shù)據(jù)庫(kù)中怎么處理重復(fù)數(shù)據(jù)

發(fā)布時(shí)間:2021-08-12 16:34:07 來(lái)源:億速云 閱讀:454 作者:Leah 欄目:大數(shù)據(jù)

這篇文章給大家介紹mysql數(shù)據(jù)庫(kù)中怎么處理重復(fù)數(shù)據(jù),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

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

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

CREATE TABLE student
(
    first_name CHAR(20),
    last_name CHAR(20),
    sex CHAR(10)
);
 

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

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

CREATE TABLE student
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10),
   PRIMARY KEY (last_name, first_name)
);
 

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

2、添加unique索引

CREATE TABLE student
(
   first_name CHAR(20) NOT NULL,
   last_name CHAR(20) NOT NULL,
   sex CHAR(10)
   UNIQUE (last_name, first_name)
);
 

這兩種看起來(lái)形式好像有一點(diǎn)區(qū)別,但是能起到相同的作用。此時(shí)我們可以插入兩條重復(fù)的數(shù)據(jù),會(huì)發(fā)現(xiàn)報(bào)錯(cuò)。

當(dāng)然我們還可以在數(shù)據(jù)庫(kù)中去驗(yàn)證一下:

SELECT COUNT(*) as repetitions, last_name, first_name
       FROM student
       GROUP BY last_name, first_name
       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ù)庫(kù)中已經(jīng)存在的數(shù)據(jù),如果數(shù)據(jù)庫(kù)沒(méi)有數(shù)據(jù),就插入新的數(shù)據(jù),如果有數(shù)據(jù)的話就跳過(guò)這條數(shù)據(jù)。這樣就可以保留數(shù)據(jù)庫(kù)中已經(jīng)存在數(shù)據(jù),達(dá)到在間隙中插入數(shù)據(jù)的目的。

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

我們還是舉例說(shuō)明:

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

現(xiàn)在我們看出來(lái)了吧,也就是說(shuō)在執(zhí)行第一條插入操作的時(shí)候,看到數(shù)據(jù)庫(kù)沒(méi)有,則直接插入一條新紀(jì)錄,因此一行記錄受到影響,但是在第二次插入的時(shí)候,數(shù)據(jù)庫(kù)已經(jīng)有一條一樣的了,因此便不會(huì)插入了,0行受到影響。
當(dāng)然了還有一個(gè)指令也可以完成類似于insert ignore into相似的功能,那就是replace  into。他表示的是如果存在primary 或 unique相同的記錄,則先刪除掉。再插入新記錄。

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

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

SELECT DISTINCT last_name, first_name
FROM student
ORDER BY last_name;
 

你也可以使用 GROUP BY 來(lái)讀取數(shù)據(jù)表中不重復(fù)的數(shù)據(jù):

SELECT last_name, first_name
FROM student
GROUP BY (last_name, first_name);
 

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

這種情況其實(shí)就相當(dāng)于,在水的終點(diǎn)處去解決。看下面sql語(yǔ)句:

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

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

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


關(guān)于mysql數(shù)據(jù)庫(kù)中怎么處理重復(fù)數(shù)據(jù)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI