Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: UNIQUE KEY na kilku kolumnach i odwrócony
Forum PHP.pl > Forum > Bazy danych > MySQL
pracus
Czy jest możliwość nałożenia na tabelę unikalnego klucza na dwóch kolumnach, który działa w standardowej i odwróconej kolejności?

Przykładowo tabela zawiera kolumny A i B, wpisując wartości (1,3) chcę, aby klucz unikalny był zarówno 1-3, jak i 3-1 i zapobiegał jednocześnie wpisaniu drugi raz pary (1,3) oraz pary (3,1).
BaN
Załóż dwa klucze unikalne:
  1. ALTER TABLE `tabela` ADD UNIQUE (`A`,`B`);
  2. ALTER TABLE `tabela` ADD UNIQUE (`B`,`A`);
pracus
Mimo to pozwala na dodanie odwróconych wartości.
BaN
Przepraszam, źle zrozumiałem wczoraj. Bez wyzwalaczy raczej tego nie zrobisz w samej bazie danych. Pokażę na przykładzie jak można to zrobić
Załóżmy, że masz tabelę:
  1. CREATE TABLE `tabela` (
  2. `a` int(10) UNSIGNED NOT NULL DEFAULT '0',
  3. `b` int(10) UNSIGNED NOT NULL DEFAULT '0'
  4. );

Dodajemy kolejną kolumnę z ustawionym indeksem UNIQUE:
  1. ALTER TABLE `tabela` ADD `indeks` VARCHAR(21) NOT NULL DEFAULT '',
  2. ADD UNIQUE (`indeks`)

będzie ona przechowywać najpierw jako pierwszą większą z liczb a i b, później jakiś znak, później mniejszą z liczb a i b, dlatego typ VARCHAR(21)

Następnie dodajesz wyzwalacz przynajmniej przed dodawaniem nowych rekordów, jako znaku rozdzielającego użyłem przecinka:
  1. DELIMITER //
  2. CREATE TRIGGER `tabela_trigger1` BEFORE INSERT ON `tabela`
  3. FOR EACH ROW
  4. BEGIN
  5. IF new.a>=new.b THEN
  6. SET new.indeks=CONCAT(new.a, ',' ,new.b);
  7. ELSE
  8. SET new.indeks=CONCAT(new.b, ',' ,new.a);
  9. END IF;
  10. END;
  11. //
  12. DELIMITER ;


Jeżeli te liczby a i b będziesz zmieniać za pomocą zapytań UPDATE, to należy jeszcze napisać kolejny wyzwalacz przy zmianie danych, analogicznie jak ten wyżej ale ze zdarzeniem BEFORE UPDATE

Ewentualnie nie cudować z wyzwalaczami w bazie danych i w PHP wcześniej wykonać zapytania, które sprawdzą czy dana operacja jest dozwolona, ja raczej bym tak zrobił
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.