Mehrere Primärschlüssel in PostgreSQL

13

Ich habe folgende Tabelle:

CREATE TABLE word(
word CHARACTER VARYING NOT NULL,
id BIGINT NOT NULL,
repeat INTEGER NOT NULL
);
ALTER TABLE public.word OWNER TO postgres;
ALTER TABLE ONLY  word ADD CONSTRAINT "ID_PKEY" PRIMARY KEY (word,id);

Wenn ich versuche, es mit folgendem Befehl wiederherzustellen:

psql -U postgres -h localhost -d word -f word.sql 

es gibt mir diesen Fehler:

Mehrere Primärschlüssel für die Tabelle "Wort" sind nicht zulässig

Wie kann ich mehrere Primärschlüssel in Postgres verwenden?

mostafa
quelle

Antworten:

25

Wie kann ich mehrere Primärschlüssel in Postgres verwenden?

Das kannst du nicht. Es ist ein Oxymoron - die Definition eines Primärschlüssels ist, dass es der Primärschlüssel ist, Singular. Sie können nicht mehr als eine haben.

Sie können mehrere uniqueEinschränkungen haben. Sie können einen Primärschlüssel haben, der mehrere Spalten enthält (einen zusammengesetzten Primärschlüssel). Sie können jedoch nicht mehr als einen Primärschlüssel für eine Tabelle haben.

Der angezeigte Code erzeugt jedoch nicht den von Ihnen erwähnten Fehler:

$ psql -U postgres regress <<__END__
CREATE TABLE word(
word CHARACTER VARYING NOT NULL,
id BIGINT NOT NULL,
repeat INTEGER NOT NULL
);
ALTER TABLE public.word OWNER TO postgres;
ALTER TABLE ONLY  word ADD CONSTRAINT "ID_PKEY" PRIMARY KEY (word,id);
__END__
CREATE TABLE
ALTER TABLE
ALTER TABLE
$

Vermutlich haben Sie diese Tabelle bereits definiert und ignorieren die vorherigen Fehler und zeigen dann nur den letzten an. Wenn ich diesen Code erneut ausführe, erhalte ich die Ausgabe:

ERROR:  relation "word" already exists
ALTER TABLE
ERROR:  multiple primary keys for table "word" are not allowed

Der eigentliche Fehler hier ist natürlich der erste.

Ich empfehle dringend, immer -v ON_ERROR_STOP=1in zu verwenden psql, z.

$ psql -v ON_ERROR_STOP=1 -U postgres regress <<__END__
CREATE TABLE word(
word CHARACTER VARYING NOT NULL,
id BIGINT NOT NULL,
repeat INTEGER NOT NULL
);
ALTER TABLE public.word OWNER TO postgres;
ALTER TABLE ONLY  word ADD CONSTRAINT "ID_PKEY" PRIMARY KEY (word,id);
__END__

ERROR:  relation "word" already exists
$

Sehen Sie, wie es beim ersten Fehler stoppt?

(Dies wäre die Standardeinstellung, würde jedoch die Abwärtskompatibilität beeinträchtigen.)

Craig Ringer
quelle