[MySQL] GUID

0

Zmieniam klucze z INTów na GUIDy.
Napisałem procedurę która to robi, tylko po zmianie jakichś 100 rekordów wystakuje mi probelm z duplikatem klucza (czyli generowane są dwa takie same guidy?? ). Rozumiem że mogą się wygenerować dwa takie same, ALE NIE ZA KAŻDYM RAZEM!
Nie wiem czy to wina tego że procedura wykonuje sie w tak krótkim czasie czy to błąd w napisaniu procedury.

Delimiter $$

DROP PROCEDURE IF EXISTS myProc $$
CREATE PROCEDURE myProc ()
	BEGIN

		DECLARE gen_guid  VARCHAR(36);
		DECLARE countryID INT;
		DECLARE no_more_departments INT;

		DECLARE country_id_to_guid
		CURSOR FOR SELECT country_id FROM country;

		DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments=1;

		SET no_more_departments=0;
		OPEN country_id_to_guid;
			dept_loop:REPEAT

				FETCH country_id_to_guid INTO countryID;
				SET gen_guid = uuid();
				-- country_id jako klucz główny
				UPDATE country SET country_id=gen_guid WHERE country_id=countryID;
				-- country_id jako klucze obce
				UPDATE team SET country_id=gen_guid WHERE country_id=countryID;
				UPDATE user SET country_id=gen_guid WHERE country_id=countryID;

			UNTIL no_more_departments
			END REPEAT dept_loop;
		CLOSE country_id_to_guid;
		SET no_more_departments=0;

	END$$

Delimiter ;
0

generalnie nie powinny sie powtorzyc guuidy (aczkolwiek spotkalem sie z taka opcja jednak byla opisana jako bug).

czy na pewno zmieniles pole country_id z INT na VARCHAR ??

Podaj jeszcze SHOW CREATE TABLE dla tych tabel.

0

Tak mam country_id zapisane jako VARCHAR(36)

tabla country:

CREATE TABLE  'country` (
  `country_id` varchar(36) collate utf8_bin NOT NULL,
  `name` varchar(80) character set latin1 NOT NULL,
  `iso` varchar(2) character set latin1 NOT NULL,
  `iso3` varchar(3) character set latin1 NOT NULL,
  PRIMARY KEY  (`country_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC;

tabela team:

CREATE TABLE  'team' (
  `team_id` varchar(36) collate utf8_bin NOT NULL,
  `name` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL,
  `country_id` varchar(36) collate utf8_bin NOT NULL default '0',
  `country` varchar(128) collate utf8_bin NOT NULL,
  `www` varchar(255) collate utf8_bin NOT NULL,
  `description` text collate utf8_bin NOT NULL,
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`team_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC;

tabela user:

CREATE TABLE  'user' (
  `user_id` varchar(36) collate utf8_bin NOT NULL,
  `login` varchar(40) character set utf8 collate utf8_unicode_ci NOT NULL,
  `password` varchar(40) collate utf8_bin NOT NULL,
  `email` varchar(40) character set utf8 collate utf8_unicode_ci NOT NULL,
  `fullname` varchar(40) character set utf8 collate utf8_unicode_ci NOT NULL,
  `nickname` varchar(40) collate utf8_bin NOT NULL,
  `country_id` varchar(36) collate utf8_bin NOT NULL,
  `role` tinyint(4) NOT NULL default '1',
  `active` tinyint(1) NOT NULL default '0',
  `token` varchar(32) collate utf8_bin NOT NULL,
  `created` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `lastseen` timestamp NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=DYNAMIC;
0

Wyglada OK. Pytanie jak sie zachowuje jeszcze mysql przy modyfikacji tabeli, ktora sie otwiera (niby pisze, ze moze robic kopie albo nie, zbyt wiele nie podane w dokumentacji).

Mozesz sprawdzic uuidy (ale watpie, ze to to ?!) zamiast insert update tylko insert do innej tabeli (zapis samego uuida). Potem SELECT count() FROM tab_z_uuidami GROUP BY uuidy HAVING count()>=2
Jak cos bedzie to 2 razy ten sam.

0

Dzięki wielkie reichel, już wiem co było nie tak.
Otóż miałem już kilka guidów jako country_id w tabeli country a w procedurze mam:
DECLARE countryID INT;wtedy pobiera tylko pierwsze cyfry, a te mogą być identyczne.
Wystarczyło zmienić INT na VARCHAR(36) i wszystko bangla ;-)

0

Ch che takie bledy sa najlepsze .... czasami to pare dni potrafia ubic.

1 użytkowników online, w tym zalogowanych: 0, gości: 1