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?
Odpowiedz
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')
.
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.
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
- 1. Zmień kolumnę w Railsach, aby była unikalna.
- 2. MySQL: Unikalne ograniczenie na wielu polach
- 3. Django: IntegrityError: kolumna id_użytkownika nie jest unikalna
- 4. Regex, aby sprawdzić, czy liczba jest równa
- 5. Kolumna nie może mieć wartości null, nie można wstawić
- 6. Zapytanie MySQL: Jak wybierać wiersze, które nie mają określonej wartości?
- 7. Spraw, aby szerokość wyświetlanych komórek tabeli była równa
- 8. Czy można mieć indeksowany widok w MySQL?
- 9. Znajdź, czy kolumna ma unikalne ograniczenie
- 10. MySQL ORDER BY określonej wartości
- 11. Składnia MYSQL nie jest równa nieobecności o wartości null
- 12. Dlaczego HashMap wymaga, aby początkowa pojemność była potęgą dwóch?
- 13. Kolumna tekstu MySQL jest obcięta
- 14. regexp, aby dopasować ciąg1, chyba że poprzedzi go ciąg2
- 15. Czy jest możliwe, aby wartość adnotacji Java była obowiązkowa?
- 16. Zapytanie MYSQL: najnowszy datownik + unikalna wartość z ostatnich 30 minut
- 17. Zaktualizuj atrybuty, chyba że puste?
- 18. Jeśli zmienna jest równa wartości php
- 19. Czy wartości mysql indeksu puste?
- 20. Liczba kolumn MySQL o określonej wartości
- 21. Czy można wyrazić ograniczenie sprawdzające?
- 22. Czy istnieje ograniczenie złożoności typu, które można wywnioskować na podstawie wartości Lombok?
- 23. MySQL gdzie klauzula jest równa wszystkim (SELECT * WHERE col = ANY_VALUE)
- 24. Czy długość łańcuchów jest równa wielkości bajtu?
- 25. nie można skompilować modułów zewnętrznych, chyba że podano flagę "--module"
- 26. Czy następujące sprawdzanie poprawności oznacza, że pole nie może mieć wartości NULL? (@Size adnotacja)
- 27. mangusta równa drugiej wartości
- 28. Qt QTableView, aby mieć tylko pole wyboru tylko kolumna
- 29. php nie jest równa i nie jest równa, równa
- 30. Pandy: unikalna ramka danych
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'. –
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ć. –
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 –