Kann ich einer PostgreSQL-Tabelle eine EINZIGARTIGE Einschränkung hinzufügen, nachdem sie bereits erstellt wurde?

185

Ich habe folgende Tabelle:

 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

Ich will nicht , dass es immer mehr als eine Spalte für jedes gegebenes sein tickername/ tickerbbnamePaar. Ich habe die Tabelle bereits erstellt und habe viele Daten darin (von denen ich bereits sichergestellt habe, dass sie die eindeutigen Kriterien erfüllen). Wenn es jedoch größer wird, schleicht sich Raum für Fehler ein.

Gibt es UNIQUEan dieser Stelle eine Möglichkeit, eine Einschränkung hinzuzufügen ?

Thomas Browne
quelle

Antworten:

362

psqlInline-Hilfe:

\h ALTER TABLE

Auch in den Postgres-Dokumenten dokumentiert (eine hervorragende Ressource sowie leicht zu lesen).

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);
hhaamu
quelle
6
danke @hhaamu. Yep hat die Dokumente ausprobiert, aber Ihre obigen Angaben sind viel prägnanter.
Thomas Browne
117
Wenn Sie möchten, dass PostgreSQL den Indexnamen generiert, verwenden Sie ALTER TABLE tablename ADD UNIQUE (columns);. (Beachten Sie, dass das CONSTRAINTSchlüsselwort weggelassen werden muss.)
jpmc26
5
Ich brauchte eine Antwort auf diese Frage und fing an, nach den Dokumenten zu googeln. Anstelle der Postgres-Dokumentation bin ich bei StackOverflow auf dieses Thema gestoßen. Obwohl es ein guter Gedanke ist, auf die offiziellen Dokumente zu verweisen, ist es auch sehr gut, die Antwort für zukünftige Besuche zu geben. Danke für das.
Leonard
@ jpmc26 «Wenn Sie möchten, dass PostgreSQL den Indexnamen generiert» Sie meinen den Einschränkungsnamen?
Smoking
4
@tuxayo, eine eindeutige Einschränkung wird über einen Index in Postgres implementiert (um nicht pedantisch zu sein).
Chris W.
36

Ja, du kannst. Wenn Ihre Tabelle jedoch nicht eindeutige Einträge enthält, schlägt dies fehl. Hier erfahren Sie, wie Sie Ihrer Tabelle eine eindeutige Einschränkung hinzufügen. Wenn Sie PostgreSQL 9.x verwenden, können Sie den folgenden Anweisungen folgen.

CREATE UNIQUE INDEX constraint_name ON table_name (columns);
Zeck
quelle
3
Danke Zeck - nette 2y spätere Antwort, aber trotzdem zu schätzen wissen, dass sich die Leute immer noch die Zeit nehmen! Tom
Thomas Browne
1
Das stimmt nicht In den neuesten Postgres führt dies auch zu der Meldung "Schlüssel (uuid) = (3a533772-07ac-4e76-b577-27a3878e2222) wird dupliziert. Abfrage fehlgeschlagen", wenn Sie einen Wert haben, der nicht eindeutig ist ...
Strinder
3
@Strinder, wie ist das nicht gut? Korrigieren Sie zuerst die duplizierten Daten.
Jasen
3
@Jasen Das ist völlig klar. Ich wollte nur betonen, dass die Antwort "Aber wenn Sie nicht eindeutige Einträge in Ihrer Tabelle haben. Hier ist, wie Sie eindeutige Einschränkungen für Ihre Tabelle hinzufügen." wird nicht funktionieren. Nicht eindeutige Einträge müssen natürlich immer vorher konsolidiert werden.
Strinder
Die Antwort wurde aus Gründen der Klarheit bearbeitet
Xavier Ho
6

Wenn Sie eine Tabelle hatten, in der bereits Einschränkungen vorhanden waren, die beispielsweise auf: Name und Nachname basieren, und Sie eine weitere eindeutige Einschränkung hinzufügen wollten, mussten Sie die gesamte Einschränkung löschen durch:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

Stellen Sie sicher, dass die neue Einschränkung, die Sie hinzufügen möchten, für alle Daten in dieser Tabelle eindeutig / nicht null ist (wenn Microsoft SQL nur einen Nullwert enthalten kann), und erstellen Sie sie anschließend neu.

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);
Lucas Campos
quelle
5

Ja, Sie können nachträglich eine EINZIGARTIGE Einschränkung hinzufügen. Wenn Ihre Tabelle jedoch nicht eindeutige Einträge enthält, beschwert sich Postgres darüber, bis Sie sie korrigieren.

Jordan S. Jones
quelle
7
select <column> from <table> group by 1 having count(*) > 1;gibt einen Bericht über doppelte Werte.
Jasen