Frage

Ich habe eine Datenbank mit ein paar Millionen Datensätzen erhalten, in der sich aber offenbar doppelte Datensätze befinden könnten.

Ein Benutzer gibt Daten in die Datenbank ein und ein Primärschlüssel wird generiert. Wenn der Benutzer jedoch dieselben Daten erneut eingibt, wird ein neuer Primärschlüssel für diese Daten generiert, auch wenn die Daten bereits zuvor eingegeben wurden.Es gibt hierzu keine Kontrollen.

Ich muss nach diesen Duplikaten suchen, weiß aber nicht wirklich, wo ich anfangen soll.Zuerst dachte ich daran, alle Zellen außer dem Primärschlüssel in einer Unterabfrage zu verketten und dann diese Zeilen zu zählen und zu sehen, welche eine Anzahl von mehr als 1 haben.

cfr.

pkey    recipe     fkey    comment
1   toast       3       tasty
2   curry       2       spicy
3   curry       2       spicy
4   bread       1           crumbly
5   orios       2       cookies

Hier sind die Curry-Einträge identisch und ich müsste einen davon löschen.

Ich habe jedoch gelesen, dass die Verkettung in MySQL unvorhersehbar ist und sich für mich auch etwas falsch anfühlt.

Irgendwelche Hinweise?

War es hilfreich?

Lösung

Angenommen, Ihre Tabelle heißt ingredients.Versuche Folgendes:

Schritt 01) Erstellen Sie eine leere Löschschlüsseltabelle mit dem Namen ingredients_delete_keys

CREATE TABLE ingredients_delete_keys
SELECT fk,recipe,pkey FROM ingredients WHERE 1=2;

Schritt 02) Erstellen Sie einen PRIMÄRSCHLÜSSEL ingredients_delete_keys

ALTER TABLE ingredients_delete_keys ADD PRIMARY KEY (fk,recipe,pkey);

Schritt 03) Indizieren Sie die ingredients Tabelle mit fk,recipe,pkey

ALTER TABLE ingredients ADD INDEX fk_recipe_pkey_ndx (fk,recipe,pkey);

Schritt 04) Füllen Sie die aus ingredients_delete_keys Tisch

INSERT INTO ingredients_delete_keys
SELECT fk,recipe,MIN(pkey)
FROM ingredients GROUP BY fk,recipe;

Schritt 05) Führen Sie einen DELETE JOIN für die Zutatentabelle mit nicht übereinstimmenden Schlüsseln durch

DELETE B.*
FROM ingredients_delete_keys A
LEFT JOIN ingredients B
USING (fk,recipe,pkey)
WHERE B.pkey IS NULL;

Schritt 06) Lassen Sie die Löschtasten fallen

DROP TABLE ingredients_delete_keys;

Schritt 07) Entfernen Sie das fk_recipe_pkey_ndx Index

ALTER TABLE ingredients DROP INDEX fk_recipe_pkey_ndx;

OK Hier sind alle Zeilen in einem Block...

CREATE TABLE ingredients_delete_keys
SELECT fk,recipe,pkey FROM ingredients WHERE 1=2;
ALTER TABLE ingredients_delete_keys ADD PRIMARY KEY (fk,recipe,pkey);
ALTER TABLE ingredients ADD INDEX fk_recipe_pkey_ndx (fk,recipe,pkey);
INSERT INTO ingredients_delete_keys
SELECT fk,recipe,MIN(pkey)
FROM ingredients GROUP BY fk,recipe;
DELETE B.*
FROM ingredients_delete_keys A
LEFT JOIN ingredients B
USING (fk,recipe,pkey)
WHERE B.pkey IS NULL;
DROP TABLE ingredients_delete_keys;
ALTER TABLE ingredients DROP INDEX fk_recipe_pkey_ndx;

Versuche es !!!

VORBEHALT

Beachten Sie, dass die Verwendung der MIN-Funktion dabei hilft, den ersten für fk eingegebenen pkey beizubehalten.Wenn Sie stattdessen auf die MAX-Funktion umschalten, wird der zuletzt für fk eingegebene pkey beibehalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top