Delete all duplicate records

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Thomas

Thomas

09/06/2007 16:45:00
Quote Anchor link
Hallo, ik heb een hele grote database met veel duplicate records erin, dus heb ik een aantal tutorials doorgelezen en een query gemaakt. Dit is mijn tabel devices:

id | brand | model |wurfl_id | user_agent

1 | sony | k800i | k8_ver1 | k800i_cd_ver1
enz

Nu zijn er heel veel duplicaten en wil ik van alle records maar 1 identiek model overhouden. Ik schreef daarvoor deze query:

delete from devices
where (id, model)
not in
( select min(id), model
from devices group by model);

Echter krijg ik nu een error die zegt:

#1093 - You can't specify target table 'devices' for update in FROM clause

Ik snap er niks van, ik voer toch gewoon een kleine sub-query uit, dat moet toch werken?

Alvast erg bedankt!
 
PHP hulp

PHP hulp

25/11/2024 11:57:01
 
Frank -

Frank -

10/06/2007 03:44:00
Quote Anchor link
Ga eerst eens normaliseren (zie de tutorials) voordat je verder gaat. 'brand' hoor je slechts 1x op te slaan, in de tabel 'brands', en vervolgens te koppelen aan de talen 'devices'.

Vervolgens ga je met UNIQUE de kolommen uniek maken, hierdoor wordt het onmogelijk om weer dubbele gegevens (lees: corrupte database) te krijgen.

Wanneer je dat allemaal voor elkaar hebt, ga je de huidige zooi omzetten naar de nieuwe database.
 
Thomas

Thomas

10/06/2007 18:51:00
Quote Anchor link
Frank schreef op 10.06.2007 03:44:
Ga eerst eens normaliseren (zie de tutorials) voordat je verder gaat. 'brand' hoor je slechts 1x op te slaan, in de tabel 'brands', en vervolgens te koppelen aan de talen 'devices'.

Vervolgens ga je met UNIQUE de kolommen uniek maken, hierdoor wordt het onmogelijk om weer dubbele gegevens (lees: corrupte database) te krijgen.

Wanneer je dat allemaal voor elkaar hebt, ga je de huidige zooi omzetten naar de nieuwe database.


Brand hoeft volgens mij helemaal geen aparte tabel te hebben, zo werkt het ook prima. Het UNIQUE kolom kan ik niet vinden in PHPMYADMIN.

Betreft de laatste zin, ik werk met een tabel, geen gehele database. Ik vraag niet om een perfecte database, ik wil alleen de huidige data bewerken, omdat er geen data meer bijkomt.

Iemand die mij wel kan vertellen hoe ik gewoon een gepaste query kan uitvoeren zonder mijn hele database op te gooien?
 
Joren de Wit

Joren de Wit

10/06/2007 19:16:00
Quote Anchor link
Quote:
Brand hoeft volgens mij helemaal geen aparte tabel te hebben, zo werkt het ook prima. Het UNIQUE kolom kan ik niet vinden in PHPMYADMIN.
Natuurlijk hoort dit wel in een aparte tabel. Er zijn immers toch meerdere 'devices' van hetzelfde merk? Jij slaat nu zeker bij elk apparaat de naam als merk op en dat is niet juist!

Wat betreft de UNIQUE constraints, die kun je gewoon met behulp van phpmyadmin op 1 of meerdere kolommen aanbrengen. Net zoals je een primary key aanbrengt.

ps. Wat je nu als noodoplossing zou kunnen doen is precies eenzelfde tabel aanmaken, met dezelfde kolommen. En vervolgens deze tabel vullen met een INSERT INTO ... SELECT query. Hierbij selecteer je natuurlijk alleen de unieke records.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Klaasjan Boven

Klaasjan Boven

10/06/2007 19:29:00
Quote Anchor link
Omdat je dingen weggaat gooien uit devisces mag dat niet dan beter zo.

CREATE table temp AS select min(id), model
from devices group by model

DELETE from devices
WHERE id NOT IN (SELECT id FROM temp)

Edit:

uiteraard niet aansprakelijk voor dataverlies
Gewijzigd op 01/01/1970 01:00:00 door Klaasjan Boven
 
Thomas

Thomas

10/06/2007 19:45:00
Quote Anchor link
OK bedankt voor de posts.

Begrijp me niet verkeerd hoor, maar ik heb deze database in 4 minuten laten genereren door een INSERT INTO php-script, dus dataverlies maakt me niet uit want dat voer ik gewoon opnieue het script uit.

Ik ga even proberen de database opnieuw te vullen, maar dan met UNIQUE als contraint bij "model".

Deze query:

CREATE table temp AS select min(id), model
from devices group by model

doet trouwens prima wat ik wil, hoewel ik toch denk dat het niet de meest professionele methode is.

Ik snap nog steeds niet waarom brand perse apart moet zijn, (het levert immers geen fouten op). Maar ik ga me zeker even verdiepen in normalisatie, ik wil namelijk geen foutief product opleveren.

Bedankt allen.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.