sql >> Database >  >> RDS >> Mysql

Dubbele rijen verwijderen uit MySql-tabel

Je hebt een aantal opties.

Laat de database het werk doen

Maak een kopie van uw tabel met een unieke index - en voeg vervolgens de gegevens in vanuit uw brontabel:

CREATE TABLE clean LIKE pst_nw;
ALTER IGNORE TABLE clean ADD UNIQUE INDEX (add1, add2, add3, add4);
INSERT IGNORE INTO clean SELECT * FROM pst_nw;
DROP TABLE pst_nw;
RENAME TABLE clean pst_nw;

Het voordeel van deze manier van werken is dat u kunt controleren of uw nieuwe tabel correct is voordat u uw brontabel laat vallen. Het nadeel is dat het twee keer zoveel ruimte in beslag neemt en (relatief) traag is om uit te voeren.

Laat de database het werk doen #2

U kunt ook het gewenste resultaat bereiken door het volgende te doen:

set session old_alter_table=1;
ALTER IGNORE TABLE pst_nw ADD UNIQUE INDEX (add1, add2, add3, add4);

De eerste opdracht is vereist als een tijdelijke oplossing voor de negeervlag wordt .. genegeerd

Het voordeel hier is dat er geen geknoei is met een tijdelijke tabel - het nadeel is dat je niet kunt controleren of je update precies doet wat je verwacht voordat je hem uitvoert.

Voorbeeld:

 CREATE TABLE `foo` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `one` int(10) DEFAULT NULL,
  `two` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

insert into foo values (null, 1, 1);
insert into foo values (null, 1, 1);
insert into foo values (null, 1, 1);

select * from foo;
+----+------+------+
| id | one  | two  |
+----+------+------+
|  1 |    1 |    1 |
|  2 |    1 |    1 |
|  3 |    1 |    1 |
+----+------+------+
3 row in set (0.00 sec)

set session old_alter_table=1;
ALTER IGNORE TABLE foo ADD UNIQUE INDEX (one, two);

select * from foo;
+----+------+------+
| id | one  | two  |
+----+------+------+
|  1 |    1 |    1 |
+----+------+------+
1 row in set (0.00 sec)

Doe dit soort dingen niet buiten de DB

Vooral met 40 miljoen rijen die zoiets buiten de db doen, zal het waarschijnlijk enorm veel tijd kosten, en misschien helemaal niet voltooien. Elke oplossing die in de database blijft, zal sneller en robuuster zijn.



  1. 3 manieren om dubbele rijen in SQL Server te verwijderen terwijl de primaire sleutel wordt genegeerd

  2. PHP MySQL instellen Verbindingstime-out

  3. Uitvoeringsplan voor MySQl-query

  4. Een diepgaande blik op Database Indexing