English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Alcuni database MySQL possono avere record duplicati, in alcune circostanze è permesso l'esistenza di dati duplicati, ma a volte è necessario eliminare questi dati duplicati.
In questa sezione, vi presenteremo come prevenire la presenza di dati duplicati nelle tabelle e come eliminare i dati duplicati nella tabella.
Puoi impostare un campo specifico nel database MySQL PRIMARY KEY (chiave primaria) oppure UNIQUE (unico) L'indice garantisce l'univocità dei dati.
Proviamo a fare un esempio: nella tabella seguente non ci sono indici né chiavi primarie, quindi la tabella può avere più record duplicati.
CREATE TABLE person_tbl ( first_name CHAR(20), last_name CHAR(20), sex CHAR(10) );
Se desideri impostare che i dati dei campi first_name, last_name nella tabella non siano duplicati, puoi impostare lo schema a doppia chiave primaria per impostare l'univocità dei dati. Se hai impostato una doppia chiave primaria, il valore predefinito di quella chiave non può essere NULL, ma può essere impostato come NOT NULL. Ecco un esempio:
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) );
Se abbiamo impostato un indice univoco, la SQL statement non eseguirà con successo durante l'inserimento di dati duplicati e genererà un errore.
La differenza tra INSERT IGNORE INTO e INSERT INTO è che INSERT IGNORE INTO ignora i dati già esistenti nel database. Se il database non ha dati, inserisce nuovi dati; se ci sono dati, salta questa riga di dati. In questo modo, si può conservare i dati già esistenti nel database e raggiungere l'obiettivo di inserire dati in un intervallo.
以下示例使用了 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 如果存在 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 -> DA 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;
你也可以使用 GROUP BY 来读取数据表中不重复的数据:
mysql> SELEZIONA last_name, first_name -> DA person_tbl -> GROUP BY (last_name, first_name);
Se desideri eliminare dati duplicati nella tabella dei dati, puoi utilizzare la seguente istruzione SQL:
mysql> CREA TABELE tmp SELEZIONA last_name, first_name, sex DA person_tbl GROUP BY (last_name, first_name, sex); mysql> CANCELLA TABELE person_tbl; mysql> ALTER TABELE tmp RINOMINA A person_tbl;
Certo, puoi anche aggiungere INDEX(indice)e PRIMARIA CHIAVE PRIMARIA(chiave primaria)alla tabella dei dati come metodo semplice per eliminare record duplicati nella tabella. Ecco come fare:
mysql> ALTER IGNORA TABELE person_tbl -> AGGIUNGI PRIMARIA CHIAVE PRIMARIA (last_name, first_name);