Chciałbym stworzyć wyzwalacz, który byłby aktywowany przed poleceniem INSET do tabeli, a jego celem byłoby stworzenie unikalnego identyfikatora.
Wyzwalacz miałby za zadanie wylosowanie liczby z zakresu od 10000 do 65535 i sprawdzenie, czy w tabeli istnieje już taki identyfikator. Następnie wylosowany ciąg liczb zapisał jako nowy identyfikator. Wiem, że mógłbym użyć tutaj autoinkrementacji, ale nie chcę, by po identyfikatorze można było stwierdzić ilość rekordów w tabeli i chciałbym, żeby każdy identyfikator miał taką samą ilość cyfr.
Poniżej mam tylko zarys tego, jak wydaje mi się, że mogłoby to wyglądać. Problem pojawia się niestety tuż przy deklaracji zmiennej, albowiem jakakolwiek próba przypisania wartości do niej wartości kończy się niezbyt jasnym dla mnie błędem w rodzaju "#1064 - check the manual that corresponds to your MySQL server version for the right syntax to user near '' at line 4" a jeżeli już mi się uda, to ten sam błąd będzie dotyczyć tego, co znajdzie się pod deklaracją zmiennych.
DROP TRIGGER IF EXISTS `wyzwalacz`; CREATE DEFINER=`root`@`localhost` TRIGGER `wyzwalacz` BEFORE INSERT ON `tabela` FOR EACH ROW BEGIN SET @rand = ROUND((RAND() * 55534 + 10000), 0); WHILE ((SELECT `id` FROM `tabela` WHERE `id` = @rand) == @rand) DO SET @rand = ROUND((RAND() * 55534 + 10000), 0); END; SET new.id = @rand; END;
Rozumiem, że gdzieś tutaj tkwi podstawowy błąd, ale ja już sam nie wiem gdzie on jest, skoro błędy tego rodzaju wyskakują mi nawet po kopiowaniu przykładów z manuala.