English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MySQL Bearbeitung von doppelten Daten

In einigen MySQL-Datenbanktabellen können wiederholte Einträge vorhanden sein. In einigen Fällen ist die Existenz wiederholter Daten erlaubt, aber manchmal müssen wir diese wiederholten Daten auch löschen.

In diesem Kapitel werden wir Ihnen zeigen, wie Sie das Auftreten wiederholter Daten in Datenbanktabellen verhindern und wie Sie wiederholte Daten aus Datenbanktabellen löschen können.

um das Auftreten wiederholter Daten in der Tabelle zu verhindern

Sie können in einer MySQL-Datenbank spezifische Felder so konfigurieren PRIMARY KEY (Hauptschlüssel) oder UNIQUE (eindeutig) Indizes, um die Einzigartigkeit der Daten zu gewährleisten.

Lassen Sie uns einen Beispielversuch durchführen: In der folgenden Tabelle gibt es weder Index noch Primärschlüssel, daher ist es möglich, mehrere duplizierte Einträge hinzuzufügen.

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

Wenn Sie das Feld first_name, last_name in der Tabelle einstellen möchten, dass keine Duplikate vorhanden sind, können Sie den Modus der doppelten Primärschlüsselkonfiguration verwenden, um die Einzigartigkeit der Daten zu setzen Wenn Sie eine doppelte Primärschlüsselkonfiguration haben, darf der Standardwert dieses Schlüssels nicht NULL sein und kann als NOT NULL konfiguriert werden. Wie folgt:

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)
);

Wenn wir einen eindeutigen Index gesetzt haben, wird der SQL-Befehl beim Einfügen wiederholter Daten nicht erfolgreich ausgeführt und wirft einen Fehler aus.

Der Unterschied zwischen INSERT IGNORE INTO und INSERT INTO besteht darin, dass INSERT IGNORE INTO bestehende Daten in der Datenbank ignoriert. Wenn keine Daten in der Datenbank vorhanden sind, werden neue Daten eingefügt, und wenn Daten vorhanden sind, wird dieses Datenfeld übersprungen. Auf diese Weise können bestehende Daten in der Datenbank beibehalten werden und das Ziel der Dateninsertion in Lücken erreicht werden.

以下示例使用了 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
    -> 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;

您也可以使用 GROUP BY 来读取数据表中不重复的数据:

mysql> SELECT last_name, first_name
    -> FROM person_tbl
    -> GROUP BY (last_name, first_name);

Doppelte Daten löschen

Wenn Sie doppelte Daten in der Datenbanktabelle löschen möchten, können Sie die folgenden SQL-Anweisungen verwenden:

mysql> CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl  GROUP BY (last_name, first_name, sex);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;

Natürlich können Sie auch durch einfache Methoden wie dem Hinzufügen von INDEX(Index) und PRIMAY KEY(Primärschlüssel)in der Tabelle doppelte Einträge löschen. Hier ist der Weg:

mysql> ALTER IGNORE TABLE person_tbl
    -> ADD PRIMARY KEY (last_name, first_name);