Delete all duplicate records
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!
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.
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?
Quote:
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!Brand hoeft volgens mij helemaal geen aparte tabel te hebben, zo werkt het ook prima. Het UNIQUE kolom kan ik niet vinden in PHPMYADMIN.
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
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
uiteraard niet aansprakelijk voor dataverlies
Gewijzigd op 01/01/1970 01:00:00 door Klaasjan Boven
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.