Sistem sa kojim radim (MySQL 5.1/innodb) ima tablu koja ima primarni ključ (bigint) i jedno varchar polje (ima još polja ali nisu bitna u ovom slučaju)
tabla
---------
id - bigint, autoinc
shortname - varchar(255)
Klijent je poželeo da ima samo vrednosti u varchar polju bez ponavljanja. Dakle ako neko stavi vrednost Pera, to ne sme posle da se ponovi.
OK to je bar lako, dodamo jedan unique index. Problem je što stari podaci moraju da prežive a u slučaju da ima duplikata označiti ih na neki način tako da se može dodati unique index pri tome treba ostaviti bar jednu originalnu vrednost od onih koje se ponavljaju. Ako imam 2 vrednosti Pera jedan treba da ostane.
Evo ga upit koji imam trenutno za taj slučaj:
I to radi OK. Moje je pitanje može li to bolje? ( (id > 0) je tu zbog mysql workbencha i one provere koju ima)
tabla
---------
id - bigint, autoinc
shortname - varchar(255)
Klijent je poželeo da ima samo vrednosti u varchar polju bez ponavljanja. Dakle ako neko stavi vrednost Pera, to ne sme posle da se ponovi.
OK to je bar lako, dodamo jedan unique index. Problem je što stari podaci moraju da prežive a u slučaju da ima duplikata označiti ih na neki način tako da se može dodati unique index pri tome treba ostaviti bar jednu originalnu vrednost od onih koje se ponavljaju. Ako imam 2 vrednosti Pera jedan treba da ostane.
Evo ga upit koji imam trenutno za taj slučaj:
Code:
UPDATE tabla
SET shortname=CONCAT_WS( '_', shortname, CAST(ROUND(RAND()*1000) AS CHAR) )
WHERE (id > 0) AND
EXISTS (
SELECT l.id,l.shortname
FROM (SELECT id,shortname FROM tabla) l,
( SELECT id, shortname
FROM tabla
GROUP BY shortname
HAVING COUNT(*)>1
) a
WHERE l.id<>a.id AND l.shortname=a.shortname
);
UPDATE tabla
SET shortname=CONCAT_WS( '_', shortname, CAST(ROUND(RAND()*1000) AS CHAR) )
WHERE (id > 0) AND
EXISTS (
SELECT l.id,l.shortname
FROM (SELECT id,shortname FROM tabla) l,
( SELECT id, shortname
FROM tabla
GROUP BY shortname
HAVING COUNT(*)>1
) a
WHERE l.id<>a.id AND l.shortname=a.shortname
);
I to radi OK. Moje je pitanje može li to bolje? ( (id > 0) je tu zbog mysql workbencha i one provere koju ima)
Potpis
Tko leti vrijedi