Erzwingen Sie in Postgresql die eindeutige Kombination von zwei Spalten


187

Ich möchte eine Tabelle in PostgreSQL so einrichten, dass zwei Spalten zusammen eindeutig sein müssen. Es kann mehrere Werte für jeden Wert geben, solange es nicht zwei gibt, die beide gemeinsam haben.

Zum Beispiel:

CREATE TABLE someTable (
    id int PRIMARY KEY AUTOINCREMENT,
    col1 int NOT NULL,
    col2 int NOT NULL
)

Also col1und col2kann wiederholen, aber nicht gleichzeitig. Dies wäre also zulässig (ohne ID)

1 1
1 2
2 1
2 2

aber nicht das:

1 1
1 2
1 1 -- would reject this insert for violating constraints

Da dies ein erstklassiges Suchergebnis in Google ist, ist es möglicherweise besser, eine Tabelle mit Änderungen zu
erstellen

Antworten:


224
CREATE TABLE someTable (
    id serial primary key,
    col1 int NOT NULL,
    col2 int NOT NULL,
    unique (col1, col2)
)

autoincrementist nicht postgresql. Du willst eine serial.

Wenn col1 und col2 eindeutig sind und nicht null sein können, bilden sie einen guten Primärschlüssel:

CREATE TABLE someTable (
    col1 int NOT NULL,
    col2 int NOT NULL,
    primary key (col1, col2)
)

5
Ich mag den Vorschlag eines Primärschlüssels gegenüber eindeutig hier, da wir in diesem Fall keine NULL-Werte zulassen. Aus den PostgeSQL-Dokumenten: "Beachten Sie, dass eine eindeutige Einschränkung selbst keinen eindeutigen Bezeichner bereitstellt, da sie keine Nullwerte ausschließt.)" Postgresql.org/docs/8.1/static/ddl-constraints.html#AEN2038
ndequeker

Wie kann ich dies in der Schemadefinition implementieren?
wagng

2
In einigen Szenarien möchten Sie möglicherweise, dass ein Ersatzschlüssel als Primärschlüssel und nicht als Kombination von Spalten verwendet wird. Insbesondere zur Verbesserung der Leistung bei Joins auf großen Datenmengen. Ich persönlich habe mich für die UNIQUE CONSTRAINT-Lösung entschieden.
Alexis.Rolland

1
Ist es möglich, eine eindeutige Einschränkung für nur eine Permutation zu erzwingen, z. B. eindeutig (col1, col2 = '1')?
Vikram Khemlani


160

Erstellen Sie eine eindeutige Einschränkung, dass zwei Zahlen zusammen NICHT wiederholt werden können:

ALTER TABLE someTable
ADD UNIQUE (col1, col2)

18

Scheint wie normale EINZIGARTIGE EINSCHRÄNKUNG :)

CREATE TABLE example (
a integer,
b integer,
c integer,
UNIQUE (a, c));

Mehr hier


1
Fügt dies einen Index für aund einen Index für cunabhängig hinzu? Weil ich schnell basierend auf amanchmal finden muss und schnell basierend auf cmanchmal finden muss.
CMCDragonkai
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.