Più chiavi primarie in PostgreSQL


13

Ho la seguente tabella:

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);

Quando provo a ripristinarlo usando il seguente comando:

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

mi dà questo errore:

non sono consentite più chiavi primarie per la tabella "word"

Come posso usare più chiavi primarie in Postgres?

Risposte:


26

come posso usare più chiavi primarie in Postgres?

Non puoi. È un ossimoro - la definizione di chiave primaria è che è la chiave primaria, singolare. Non puoi averne più di uno.

Puoi avere più uniquevincoli. Puoi avere una chiave primaria che contiene più colonne (una chiave primaria composita). Ma non puoi avere più di una chiave primaria per una tabella.

Tuttavia, il codice che mostri non produce l'errore che hai citato:

$ 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
$

Probabilmente hai già definito questa tabella e stai ignorando gli errori precedenti, mostrando quindi solo l'ultimo. Se rieseguo questo codice ottengo l'output:

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

Il vero errore qui è il primo, ovviamente.

Consiglio vivamente di usare sempre -v ON_ERROR_STOP=1in psql, ad esempio:

$ 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
$

Vedi come si ferma al primo errore?

(Sarebbe il valore predefinito ma interromperebbe la compatibilità con le versioni precedenti).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.