Czy mogę dodać ograniczenie UNIQUE do tabeli PostgreSQL po jej utworzeniu?

185

Mam następującą tabelę:

 tickername | tickerbbname  | tickertype
------------+---------------+------------
 USDZAR     | USDZAR Curncy | C
 EURCZK     | EURCZK Curncy | C
 EURPLN     | EURPLN Curncy | C
 USDBRL     | USDBRL Curncy | C
 USDTRY     | USDTRY Curncy | C
 EURHUF     | EURHUF Curncy | C
 USDRUB     | USDRUB Curncy | C

Nie chcę, aby kiedykolwiek była więcej niż jedna kolumna dla danej pary tickername/ tickerbbnamepary. Już utworzyłem tabelę i mam w niej dużo danych (które już zapewniłem, że spełniają unikalne kryteria). Jednak w miarę powiększania się, pojawia się miejsce na błąd.

Czy jest jakiś sposób na dodanie UNIQUEograniczenia w tym momencie?

Thomas Browne
źródło

Odpowiedzi:

363

psqlwewnętrzna pomoc:

\h ALTER TABLE

Dokumentowane również w dokumentach postgres (doskonałe źródło informacji, a także łatwe do odczytania).

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);
Hhaamu
źródło
6
dzięki @hhaamu. Tak, próbowałem dokumentów, ale twoje powyższe jest znacznie bardziej zwięzłe.
Thomas Browne,
117
Jeśli chcesz pozwolić PostgreSQL wygenerować nazwę indeksu, użyj ALTER TABLE tablename ADD UNIQUE (columns);. (Należy pamiętać, że CONSTRAINTsłowo kluczowe należy pominąć.)
jpmc26,
5
Potrzebowałem odpowiedzi na to pytanie i zacząłem przeglądać dokumenty. Zamiast dokumentacji Postgres natknąłem się na ten temat w StackOverflow. Więc chociaż warto odwoływać się do oficjalnych dokumentów, bardzo dobrze jest udzielić odpowiedzi na przyszłe wizyty. Dziękuję za to.
Leonard
@ jpmc26 «Jeśli chcesz pozwolić PostgreSQL wygenerować nazwę indeksu» Masz na myśli nazwę ograniczenia?
tuxayo,
4
@tuxayo, unikalne ograniczenie jest implementowane przez indeks w Postgres (nie pedantyczny).
Chris W.
36

Tak, możesz. Ale jeśli masz nie unikalne wpisy na stole, to się nie powiedzie. Oto jak dodać unikalne ograniczenie do swojego stołu. Jeśli używasz PostgreSQL 9.x, możesz wykonać poniższe instrukcje.

CREATE UNIQUE INDEX constraint_name ON table_name (columns);
Zeck
źródło
3
Dzięki Zeck - miła 2 lata później odpowiedź, ale wciąż doceniam to, że ludzie wciąż nie spieszą się! Tom
Thomas Browne,
1
To nie jest poprawne W najnowszym Postgresie prowadzi to również do komunikatu „Klucz (uuid) = (3a533772-07ac-4e76-b577-27a3878e2222) jest duplikowany. Zapytanie nie powiodło się”, jeśli masz wartość, która nie jest unikalna ...
Strinder
3
@Strinder, jak to nie jest dobra rzecz? najpierw napraw zduplikowane dane.
Jasen
3
@Jasen To całkowicie jasne. Chciałem tylko podkreślić, że odpowiedź „Ale jeśli masz nie unikalne wpisy na stole. Oto jak dodać unikalne ograniczenie na stole”. nie będzie działać. Wpisy nieunikalne należy oczywiście zawsze wcześniej skonsolidować.
Strinder
Zredagowałem odpowiedź dla jasności
Xavier Ho
6

Jeśli masz tabelę, która już zawierała ograniczenia oparte na powiedzmy: imię i nazwisko, a chciałeś dodać jeszcze jedno unikalne ograniczenie, musisz usunąć całe ograniczenie przez:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

Upewnij się, że nowe ograniczenie, które chcesz dodać, jest unikalne / nie ma wartości null (jeśli jego SQL Sql może zawierać tylko jedną wartość null) we wszystkich danych w tej tabeli, a następnie możesz go ponownie utworzyć.

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);
Lucas Campos
źródło
5

Tak, po fakcie możesz dodać ograniczenie UNIKALNE. Jeśli jednak masz w tabeli nie unikalne wpisy, Postgres będzie na to narzekać, dopóki ich nie poprawisz.

Jordan S. Jones
źródło
7
select <column> from <table> group by 1 having count(*) > 1;przekaże raport o zduplikowanych wartościach.
Jasen