mysql 處理重復數據
有些 mysql 數據表中可能存在重復的記錄,有些情況我們允許重復數據的存在,但有時候我們也需要刪除這些重復的數據。
本章節我們將為大家介紹如何防止數據表出現重復數據及如何刪除數據表中的重復數據。
防止表中出現重復數據
你可以在MySQL數據表中設置指定的字段為?PRIMARY KEY(主鍵)?或者?UNIQUE(唯一)?索引來保證數據的唯一性。
讓我們嘗試一個實例:下表中無索引及主鍵,所以該表允許出現多條重復記錄。
CREATE?TABLE?person_tbl ( ????first_name?CHAR(20), ????last_name?CHAR(20), ????sex?CHAR(10) );
如果你想設置表中字段first_name,last_name數據不能重復,你可以設置雙主鍵模式來設置數據的唯一性, 如果你設置了雙主鍵,那么那個鍵的默認值不能為NULL,可設置為NOT NULL。如下所示:
CREATE?TABLE?person_tbl ( ???first_name?CHAR(20)?NOT?NULL, ???last_name?CHAR(20)?NOT?NULL, ???sex?CHAR(10), ???PRIMARY?KEY?(last_name,?first_name) );
如果我們設置了唯一索引,那么在插入重復數據時,SQL語句將無法執行成功,并拋出錯。
INSERT IGNORE INTO與INSERT INTO的區別就是INSERT IGNORE會忽略數據庫中已經存在的數據,如果數據庫沒有數據,就插入新的數據,如果有數據的話就跳過這條數據。這樣就可以保留數據庫中已經存在數據,達到在間隙中插入數據的目的。
以下實例使用了INSERT IGNORE INTO,執行后不會出錯,也不會向數據表中插入重復數據:
mysql>?INSERT?IGNORE?INTO?person_tbl?(last_name,?first_name) ????->?VALUES(?'Jay',?'Thomas'); Query?OK,?1?row?affected?(0.00?sec) mysql>?INSERT?IGNORE?INTO?person_tbl?(last_name,?first_name) ????->?VALUES(?'Jay',?'Thomas'); Query?OK,?0?rows?affected?(0.00?sec)
INSERT IGNORE INTO當插入數據時,在設置了記錄的唯一性后,如果插入重復數據,將不返回錯誤,只以警告形式返回。 而REPLACE INTO into如果存在primary 或 unique相同的記錄,則先刪除掉。再插入新記錄。
另一種設置數據的唯一性方法是添加一個UNIQUE索引,如下所示:
CREATE?TABLE?person_tbl ( ???first_name?CHAR(20)?NOT?NULL, ???last_name?CHAR(20)?NOT?NULL, ???sex?CHAR(10) ???UNIQUE?(last_name,?first_name) );
統計重復數據
以下我們將統計表中 first_name 和 last_name的重復記錄數:
mysql>?SELECT?COUNT(*)?as?repetitions,?last_name,?first_name ????->?FROM?person_tbl ????->?GROUP?BY?last_name,?first_name ????->?HAVING?repetitions?>?1;
以上查詢語句將返回 person_tbl 表中重復的記錄數。 一般情況下,查詢重復的值,請執行以下操作:
確定哪一列包含的值可能會重復。
在列選擇列表使用COUNT(*)列出的那些列。
在GROUP BY子句中列出的列。
HAVING子句設置重復數大于1。
過濾重復數據
如果你需要讀取不重復的數據可以在 SELECT 語句中使用 DISTINCT 關鍵字來過濾重復數據。
mysql>?SELECT?DISTINCT?last_name,?first_name ????->?FROM?person_tbl ????->?ORDER?BY?last_name;
你也可以使用 GROUP BY 來讀取數據表中不重復的數據:
mysql>?SELECT?last_name,?first_name ????->?FROM?person_tbl ????->?GROUP?BY?(last_name,?first_name);
刪除重復數據
如果你想刪除數據表中的重復數據,你可以使用以下的SQL語句:
mysql>?CREATE?TABLE?tmp?SELECT?last_name,?first_name,?sex ????->??????????????????FROM?person_tbl; ????->??????????????????GROUP?BY?(last_name,?first_name); mysql>?DROP?TABLE?person_tbl; mysql>?ALTER?TABLE?tmp?RENAME?TO?person_tbl;
當然你也可以在數據表中添加 INDEX(索引) 和 PRIMAY KEY(主鍵)這種簡單的方法來刪除表中的重復記錄。方法如下:
mysql>?ALTER?IGNORE?TABLE?person_tbl ????->?ADD?PRIMARY?KEY?(last_name,?first_name);
?以上就是【mysql教程】MySQL 處理重復數據的內容,更多相關內容請關注PHP中文網(www.php.cn)!