Wéi behandelt MySQL Ufro duplizéiert Daten?Filter fir duplizéiert Datenerklärung ze läschen

MySQLWéi behandelen Ufroen duplizéiert Daten?Filter fir duplizéiert Datenerklärung ze läschen

MySQL Ëmgank duplizéiert Donnéeën

Et kann duplizéiert records an e puer MySQL Daten Dëscher ginn. A verschiddene Fäll erlaben mir d'Existenz vun duplizéiert Donnéeën, mä heiansdo musse mir och dës duplizéiert Donnéeën ze läschen.

An dësem Kapitel wäerte mir virstellen wéi Dir duplizéiert Donnéeën an der Datentabelle verhënnert a wéi Dir déi duplizéiert Donnéeën an der Datentabelle läschen.


Vermeiden duplizéiert Daten an Tabellen

Dir kënnt de spezifizéierte Feld an der MySQL Datentabelle als PRIMÄR KEY oder UNIQUE (eenzegaarteg) Index fir d'Eenzegaartegkeet vun den Donnéeën ze garantéieren.

Loosst eis e Beispill probéieren: Et gi keng Indexen a Primärschlësselen an der Tabell hei ënnen, sou datt d'Tabell e puer Duplikate records erlaabt.

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

Wann Dir d'Felder first_name an last_name an der Tabell setzen wëllt, kënnen d'Donnéeën net widderholl ginn, Dir kënnt den duebele Primärschlësselmodus setzen fir d'Eenzegaartegkeet vun den Donnéeën ze setzen. kann net NULL ginn, mee kann op NET NULL gesat ginn.Wéi follegt:

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

Wa mir en eenzegaartegen Index setzen, dann wann Dir duplizéiert Daten asetzt, wäert d'SQL Ausso net erfollegräich ausféieren an e Feeler werfen.

Den Ënnerscheed tëscht INSERT IGNORE INTO an INSERT INTO ass datt INSERT IGNORE d'Daten ignoréiert déi schonn an der Datebank existéieren. Wann et keng Donnéeën an der Datebank gëtt, setzt se nei Donnéeën a wann et Daten gëtt, sprangen se dës Donnéeën iwwer.Op dës Manéier kënnen déi existent Donnéeën an der Datebank bewahrt ginn, an den Zweck fir Daten an der Spalt z'erreechen kann erreecht ginn.

Déi folgend Beispill benotzt INSERT IGNORE INTO, déi ouni Feeler ausféiert an net duplizéiert Daten an d'Datentabelle setzt:

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 Wann Dir Daten asetzt, nodeems d'Eenzegaartegkeet vum Rekord festgeluecht ass, wann duplizéiert Daten agefouert ginn, gëtt kee Feeler zréckginn, awer nëmmen eng Warnung gëtt zréckginn.A REPLACE INTO wann et e primären oder eenzegaartege Rekord gëtt, läscht et als éischt.Füügt en neie Rekord un.

En anere Wee fir d'Eenzegaartegkeet vun Ären Donnéeën ze setzen ass en UNIQUE Index esou ze addéieren:

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

Statistiken duplizéiert Daten

Hei drënner ziele mir d'Zuel vun duplizéierten records vum Virnumm a Virnumm an der Tabell:

mysql> SELECT COUNT(*) as repetitions, last_name, first_name
    -> FROM person_tbl
    -> GROUP BY last_name, first_name
    -> HAVING repetitions > 1;

Déi uewe genannte Query Ausso wäert d'Zuel vun duplizéierten records an der person_tbl Tabelle zréckginn.Am Allgemengen, fir duplizéiert Wäerter ze froen, maacht déi folgend:

  • Bestëmmt wéi eng Kolonn méiglech duplizéiert Wäerter enthält.
  • Benotzt COUNT(*) an der Kolonnwiellëscht fir dës Kolonnen ze lëschten.
  • Kolonnen opgezielt an der GROUP BY Klausel.
  • D'HAVING Klausel setzt d'Zuel vun de Wiederholungen méi wéi 1.

Duplikatdaten filteren

Wann Dir eenzegaarteg Donnéeën liesen musst, kënnt Dir d'DISTINCT Schlësselwuert an der SELECT Ausso benotzen fir duplizéiert Daten ze filteren.

mysql> SELECT DISTINCT last_name, first_name
    -> FROM person_tbl;

Dir kënnt och GROUP BY benotze fir eenzegaarteg Daten aus enger Tabell ze liesen:

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

deduplizéiert Donnéeën

Wann Dir duplizéiert Daten an der Datetabelle wëllt läschen, kënnt Dir déi folgend SQL Ausso benotzen:

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;

Natierlech kënnt Dir och INDEX (Index) an PRIMAY KEY (Primärschlëssel) an der Datentabelle addéieren fir duplizéiert records an der Tabell ze läschen.Methode wéi hei ënnendrënner:

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

Comments

Är Email Adress gëtt net publizéiert ginn. Néideg Felder gi benotzt * Etikett

Artikel Verzeechnes
Minière zu Top