2013-03-08 20 views
6

Załóżmy, że mam tabelę, w której chcę, aby wartości MY_COLUMN były unikalne, z wyjątkiem sytuacji, gdy wartością jest "xyz". Innymi słowy, MY_COLUMN może być "xyz" w wielu wierszach, ale wszystkie wartości, które nie są "xyz", muszą być unikalne. Czy możliwe jest ustawienie ograniczenia, które to zapewnia?Czy można mieć ograniczenie MySQL, które wymaga, aby kolumna była unikalna *, chyba że * jest równa określonej wartości?

+2

Nie ekspertem w 'mysql', ale wierzę' null' jest jedyną wartością, która działa w ten sposób - czyli wszystkie wartości w wyjątkowej przymusu musi być unikalne lub 'null'. –

+1

To będzie wymagało włączenia wyzwalacza przed wstawieniem i przed aktualizacją. Wydaje się, że to bardzo mylące zagadnienie dla twojego przyszłego "ja" do debugowania. Pamiętaj, aby dokładnie to udokumentować. –

+0

Ponieważ MySQL nie obsługuje częściowego indeksu (w przeciwieństwie do większości innych DBMS), nie sądzę, że jest to łatwo możliwe –

Odpowiedz

3

Według documentation

unikatowy indeks tworzy ograniczenie takie, że wszystkie wartości w indeksie musi być wyraźne. Wystąpił błąd podczas próby dodania nowego wiersza o wartości klucza dopasowanej do istniejącego wiersza. W przypadku wszystkich silników indeks UNIQUE dopuszcza wiele wartości NULL dla kolumn, które mogą zawierać wartość NULL.

Stwórz więc kolumnę z możliwością odgrodzenia, a gdy chcesz zapytać o tabelę, po prostu użyj ISNULL(MY_COLUMN, 'xyz').

0

Nie można ustawić ograniczenie to zrobić, jednak Jeśli robisz to wnętrze powiedzmy projekt Java, można zrobić coś jak

If (MY_COLUMN != "xyz"){ 
    Get records of table with "xyz" in it 
    X = //maping would equal "Select MY_COLUMN from table" (or select * from table depending on your mapping 

następnie sprawdzić, czy każdego meczu i wreszcie jeśli nie, uruchom polecenie wstawiania. Jeśli robisz to osobiście, może inna kolumna, która jest po prostu boolem, aby powiedzieć, jeśli jest prawdziwa, to MY_COLUMN = "xyz" jeszcze spojrzeć na MY_COLUMN i dostać val. To trudne.

0

Myśląc o tym, myślę, że dostarczę swój wkład.

Jak słusznie wskazały inne odpowiedzi, MySQL nie może mieć indeksu UNIQUE, który ma duplikaty.

Nie zamierzam debatować, że to nie może być podatne na zamieszanie, ani jeśli "powinieneś" nawet zrobić coś takiego.

Możesz osiągnąć wyniki, które według mnie są takie same, dzięki regularnemu indeksowi w kolumnie my_column, ale także ustawieniu NIE NOT NULL (jest to ważne, ponieważ bez tego wyzwalacz nie będzie generował błędów w duplikatach indeksów). Następnie można utworzyć wyzwalacz dla my_table następująco:

CREATE TRIGGER my_table_unique_index_with_exception BEFORE INSERT ON my_table 
FOR EACH ROW BEGIN 
    IF NEW.my_column != 'xyz' THEN 
    -- The value isn't 'xyz' so only one instance of this value is allowed 
    -- check the count and if the value exists set it to NULL which will thorw 
    -- an error as my_column annot be NULL 
    IF (SELECT COUNT(*) FROM my_table WHERE my_table.my_row = NEW.my_column) > 0 THEN 
     SET NEW.my_column = NULL; 
    END IF; 
END 
Powiązane problemy