Múltiples claves primarias en PostgreSQL

13

Tengo la siguiente tabla:

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

Cuando intento restaurarlo usando el siguiente comando:

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

me da este error:

múltiples claves primarias para la tabla "palabra" no están permitidas

¿Cómo puedo usar varias claves primarias en postgres?

Mostafa
fuente

Respuestas:

26

¿Cómo puedo usar varias claves principales en Postgres?

No puedes Es un oxímoron: la definición de una clave primaria es que es la clave primaria, singular. No puedes tener más de uno.

Puedes tener múltiples uniquerestricciones. Puede tener una clave primaria que contenga varias columnas (una clave primaria compuesta). Pero no puede tener más de una clave primaria para una tabla.

Sin embargo, el código que muestra no produce el error que mencionó:

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

Supongo que ya ha definido esta tabla y está ignorando los errores anteriores, y luego muestra solo el último. Si vuelvo a ejecutar este código, obtengo el resultado:

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

El verdadero error aquí es el primero, por supuesto.

Recomiendo siempre utilizando -v ON_ERROR_STOP=1en psql, por ejemplo:

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

¿Ves cómo se detiene en el primer error?

(Sería el valor predeterminado, pero eso rompería la compatibilidad con versiones anteriores).

Craig Ringer
fuente