Generowanie wierszy w bazie

0

Główne założenie tego co chcę zrobić to możliwość przypisania losowego kodu (składającego się z 5 cyfr) dla obiektu. Mam dwa wyjścia:

  1. losować aż trafię na wolny numer, jednak im więcej wykorzystanych kodów tym więcej powtórzeń i czas może rosnąć nieprzewidywalnie
  2. skorzystać z tabeli będącej pulą wolnych kodów, wybrać losowy wiersz i go usunąć, jednak najpierw trzeba tą tabelę zasilić wpisami i o to mi się w tym poście rozchodzi

Napisałem sobie procedurę, która wypełni te dane, ale strasznie wolno to idzie (tabela codes składa się z jednej kolumny int będącej unikalnym kluczem).

DELIMITER $$
DROP PROCEDURE IF EXISTS CodeGenerator$$
CREATE PROCEDURE CodeGenerator()
	BEGIN
		DECLARE `from` INT;
		DECLARE `to` INT;
		SET `from` = 10000;
		SET `to` = 99999;
		WHILE `from` <= `to` DO
			INSERT IGNORE INTO `codes` SET `code` = `from`;
			SET `from` = `from` + 1;
		END WHILE;
	END$$
DELIMITER ;

CALL CodeGenerator();
DROP PROCEDURE CodeGenerator;

Utworzenie tego to jakaś godzina mielenia, trochę za długo jak na skrypt instalacyjny :U. Zastanawiam się teraz czy takie rozwiązanie ma sens, czy może lepiej ręcznie utworzyć duży wpis z masą insertów (ładujący kilka tysięcy w jednym zapytaniu)? To pewnie byłoby szybsze, tylko plik wielki, a może macie lepszy pomysł jak problem rozwiązać?

1

Jeśli to ma być skrypt instalacyjny, to może właśnie dołącz plik z insertami (spakowany, nie będzie wcale wielki :) )
Do czego Ci to w ogóle potrzebne? Czemu akurat 5 cyfr? Czemu nie możesz przypisywać innej liczby, np. losować liczbę z zakresu 10000-99999 , a do niej dokleić na koniec dokładną datę (z czasem do milisekund, czy jakiegoś timestapma) z komputera? (tak na szybko rzuciłem przykład, wiem, że nie jest idealny :D)

0
fourfour napisał(a):

Jeśli to ma być skrypt instalacyjny, to może właśnie dołącz plik z insertami (spakowany, nie będzie wcale wielki :) )

Właśnie wygenerowałem sobie taki pliczek, po 1000 numerów w jednym insercie, zajmuje 800kB niespakowany, wstawianie trwało może z 5s. Chciałem to zrobić "fajnie", ale widać, że wyszło jak zawsze - najprostsze rozwiązanie jest najlepsze :D.

fourfour napisał(a):

Do czego Ci to w ogóle potrzebne? Czemu akurat 5 cyfr? Czemu nie możesz przypisywać innej liczby, np. losować liczbę z zakresu 10000-99999 , a do niej dokleić na koniec dokładną datę (z czasem do milisekund, czy jakiegoś timestapma) z komputera? (tak na szybko rzuciłem przykład, wiem, że nie jest idealny :D)

Wymóg specyfikacji :) Ogólnie to kod ma być publicznie widoczny i łatwy do zapamiętania, stąd 5 cyfr, a losowy w miarę, żeby nikomu nie przypadł "złoty" numer.

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