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!

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.
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?
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.
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
[/edit]
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.

Reageren