Tak, MySQL zapewnia taką możliwość.
ALTER TABLE MyTable
ADD UNIQUE KEY `my_unique_key` (`group_id`, `user_id`)
Nie wiem, do czego używasz tej tabeli, ale wygląda na to, że ten unikalny klucz może być silnym kandydatem na klucz podstawowy tabeli. Klucz podstawowy jest również automatycznie kluczem unikalnym. Jeśli zdecydujesz się ustawić go jako klucz podstawowy, wykonaj następujące czynności:
ALTER TABLE MyTable
ADD PRIMARY KEY (`group_id`, `user_id`)
(Jeśli pojawi się komunikat o błędzie, że istnieje już klucz podstawowy, wydaj ALTER TABLE MyTable DROP PRIMARY KEY
a następnie powtórz powyższe polecenie.)
Edytuj: W odpowiedzi na komentarz użytkownika
Nie możesz mieć wielu wierszy z identycznymi wartościami innymi niż NULL
wartości dla kolumn objętych unikalnym kluczem. Nie możesz więc mieć dwóch wierszy, w których group_id = 0 AND user_id = 5
, na przykład. 0 to wartość. Ale jeśli sprawisz, że jedna lub obie kolumny będą miały wartość null, możesz mieć wiele wierszy, które są identyczne aż do ustawienia NULL
s. Możesz więc mieć dwa (lub więcej) wiersze, w których group_id IS NULL AND user_id = 1234
.
Warunek:Powyższe dotyczy obu powszechnie używanych silników pamięci masowej MySQL (MyISAM i InnoDB). MySQL ma silniki pamięci, w których NULL
jest uważana za unikalną wartość, ale prawdopodobnie jej nie używasz.
Jeśli ustawisz jedną lub obie kolumny na wartości null, wtedy Twój unikalny klucz nie może być kluczem podstawowym - klucz podstawowy musi znajdować się w kolumnach, które są NOT NULL
.
Załóżmy, że ustawiłeś ten klucz jako klucz podstawowy i chcesz teraz zezwolić na NULL
w group_id
kolumna. Nie wiem jaki typ danych group_id
jest w tej chwili; Zakładam, że obecnie jest to INT UNSIGNED NOT NULL
, ale będziesz musiał zmodyfikować poniższe, jeśli nie jest to. Nie będziesz już mógł używać tego klucza jako klucza podstawowego. Oto polecenie, które możesz uruchomić, aby wprowadzić żądane zmiany:
ALTER TABLE MyTable
DROP PRIMARY KEY,
MODIFY group_id INT UNSIGNED,
ADD UNIQUE KEY `my_unique_key_with_nulls` (`group_id`, `user`)