MySQL中處理各種重復(fù)的一些方法
有時(shí)表或結(jié)果集包含重復(fù)的記錄。有時(shí)它是允許的,但有時(shí)它需要停止重復(fù)的記錄。有時(shí)它需要識(shí)別重復(fù)的記錄從表中刪除。本章將介紹如何防止發(fā)生在一個(gè)表中重復(fù)的記錄如何刪除已經(jīng)存在的重復(fù)記錄。
防止重復(fù)表中的發(fā)生:
可以使用PRIMARY KEY或UNIQUE索引的表上相應(yīng)的字段來(lái)防止重復(fù)的記錄。讓我們舉一個(gè)例子,下面的表中不包含這樣的索引或主鍵,所以它會(huì)允許記錄first_name和last_name重復(fù)
CREATE TABLE person_tbl ( first_name CHAR(20), last_name CHAR(20), sex CHAR(10) );
可以使用PRIMARY KEY或UNIQUE索引的表上相應(yīng)的字段防止重復(fù)的記錄。讓我們舉一個(gè)例子,下面的表中不包含這樣的索引或主鍵,所以它會(huì)允許重復(fù)first_name和last_name記錄
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) );
表中的唯一索引的存在通常會(huì)導(dǎo)致錯(cuò)誤的發(fā)生,如果表中插入一條記錄,重復(fù)定義索引的列或列中的現(xiàn)有記錄。
使用INSERT IGNORE而不是INSERT。如果記錄不重復(fù)現(xiàn)有的記錄,MySQL將插入它像往常一樣。如果記錄是重復(fù)IGNORE關(guān)鍵字告訴MySQL靜靜地拋棄它,而不會(huì)產(chǎn)生錯(cuò)誤。
下面的示例中沒(méi)有錯(cuò)誤,同時(shí)也不會(huì)插入重復(fù)的記錄。
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。如果記錄是新的它INSERT插入。如果它是一個(gè)重復(fù)的,新的記錄將取代舊的:
mysql> REPLACE INTO person_tbl (last_name, first_name) -> VALUES( 'Ajay', 'Kumar'); Query OK, 1 row affected (0.00 sec) mysql> REPLACE INTO person_tbl (last_name, first_name) -> VALUES( 'Ajay', 'Kumar'); Query OK, 2 rows affected (0.00 sec)
使用REPLACE而不是INSERT。如果記錄是新的它INSERT插入。如果它是一個(gè)重復(fù)的,新的記錄將取代舊的:
強(qiáng)制唯一性的另一種方法是添加一個(gè)UNIQUE索引,而不是一個(gè)PRIMARY KEY表。
CREATE TABLE person_tbl ( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10) UNIQUE (last_name, first_name) );
計(jì)算和確定重復(fù):
以下是查詢數(shù)first_name和last_name表中的重復(fù)記錄。
mysql> SELECT COUNT(*) as repetitions, last_name, first_name -> FROM person_tbl -> GROUP BY last_name, first_name -> HAVING repetitions > 1;
這個(gè)查詢將返回一個(gè)列表的所有person_tbl表中重復(fù)的記錄。在一般情況下,識(shí)別重復(fù)的值,請(qǐng)執(zhí)行以下操作:
- 確定哪一列包含的值可能會(huì)重復(fù)。
- 在列選擇列表中隨著COUNT(*)列出的那些列。
- 以及在GROUP BY子句中列出的列。
- 新增的HAVING子句消除了獨(dú)特的值要求的組數(shù)大于1。
消除重復(fù)查詢結(jié)果:
可以使用DISTINCT與SELECT語(yǔ)句一起找出表中唯一的紀(jì)錄。
mysql> SELECT DISTINCT last_name, first_name -> FROM person_tbl -> ORDER BY last_name;
DISTINCT是添加一個(gè)GROUP BY子句中命名的列,選擇的另一種方法。這具有除去重復(fù)和只選擇的獨(dú)特的組合中的指定的列的值的效果:
mysql> SELECT last_name, first_name -> FROM person_tbl -> GROUP BY (last_name, first_name);
刪除重復(fù)使用表更換:
如果在一個(gè)表中有重復(fù)的記錄,想從該表中刪除所有的重復(fù)記錄,看看下面程序的例子。
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;
從一個(gè)表中刪除重復(fù)記錄的一個(gè)簡(jiǎn)單的方法是添加KEY,表索引或PRIMAY。如果該表已經(jīng)是可用的,那么使用此方法刪除重復(fù)的記錄。
mysql> ALTER IGNORE TABLE person_tbl -> ADD PRIMARY KEY (last_name, first_name);
相關(guān)文章
MySQL5.7.24版本的數(shù)據(jù)庫(kù)安裝過(guò)程圖文詳解
這篇文章主要介紹了MySQL5.7.24版本的數(shù)據(jù)庫(kù)安裝過(guò)程,需要的朋友可以參考下2018-11-11
MySQL解決數(shù)據(jù)導(dǎo)入導(dǎo)出含有外鍵的方案
這篇文章主要介紹了MySQL解決數(shù)據(jù)導(dǎo)入導(dǎo)出含有外鍵的情況,文中通過(guò)圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家解決問(wèn)題有一定的幫助,需要的朋友可以參考下2024-11-11
最新MySQL數(shù)據(jù)庫(kù)漏洞情況通報(bào)
本文是對(duì)近期mysql報(bào)出的漏洞情況進(jìn)行了簡(jiǎn)單的說(shuō)明以及漏洞的修復(fù)措施分享,有需要的小伙伴一定要關(guān)注下2016-09-09
解析MYSQL 數(shù)據(jù)庫(kù)導(dǎo)入SQL 文件出現(xiàn)亂碼的問(wèn)題
本篇文章是對(duì)MYSQL數(shù)據(jù)庫(kù)導(dǎo)入SQL文件出現(xiàn)亂碼的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
MySQL數(shù)據(jù)庫(kù)varchar的限制規(guī)則說(shuō)明
本文我們主要介紹了MySQL數(shù)據(jù)庫(kù)中varchar的限制規(guī)則,并以一個(gè)實(shí)際的例子對(duì)限制規(guī)則進(jìn)行了說(shuō)明,希望能夠?qū)δ兴鶐椭?/div> 2011-08-08
CentOS 7.0如何啟動(dòng)多個(gè)MySQL實(shí)例教程(mysql-5.7.21)
這篇文章主要給大家介紹了關(guān)于CentOS 7.0如何啟動(dòng)多個(gè)MySQL實(shí)例(mysql-5.7.21)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。2018-03-03最新評(píng)論

