Czy możliwe jest niestandardowe ograniczenie kolumny w następujący sposób? Załóżmy, że mam dwa cols subset
i type
oba ciągi (chociaż typy danych prawdopodobnie nie mają znaczenia).
Jeśli type
jest „prawdziwe”, to chcę, aby kombinacja type
i subset
była unikalna. W przeciwnym razie nie ma ograniczeń. Używam PostgreSQL 8.4 na Debianie.
postgresql
index
constraint
unique-constraint
postgresql-8.4
Faheem Mitha
źródło
źródło
Odpowiedzi:
Innymi słowy, chcesz
subset
być wyjątkowy, jeślitype = 'true'
. Częściowy indeks unikalny zrobi, że:W ten sposób możesz nawet tworzyć kombinacje z
NULL
unikalnymi, co inaczej nie jest możliwe - jak szczegółowo opisano w pokrewnej odpowiedzi:Wielokolumnowe ograniczenie PostgreSQL i wartości NULL
źródło
Jest to uzupełnienie powyższej odpowiedzi Erwina, ale PostgreSQL obsługuje wiele rodzajów indeksów. Zasadniczo nie wykluczają się one wzajemnie. Możesz myśleć o nich jako:
Wszystkie te można łączyć na różne sposoby. Wszystko, co tutaj robisz, to używanie unikalnych i częściowych funkcji, dzięki czemu uzyskujesz częściowe unikalne indeksy (które są niezwykle przydatne, gdy się dowiadujesz.
Załóżmy jednak, że chcesz mieć indeks bez rozróżniania wielkości liter w polu podzestawu, w którym typ jest prawdziwy. Następnie dodaj definicję funkcjonalną:
Zauważ, że tworzy to unikalny indeks na wyjściu funkcji lower () wywoływanej w atrybucie podzestawu, gdzie typ jest prawdziwy.
źródło