Plusieurs clés primaires dans PostgreSQL

13

J'ai le tableau suivant:

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

Lorsque j'essaie de le restaurer à l'aide de la commande suivante:

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

cela me donne cette erreur:

plusieurs clés primaires pour la table "mot" ne sont pas autorisées

Comment puis-je utiliser plusieurs clés primaires dans postgres?

mostafa
la source

Réponses:

26

comment puis-je utiliser plusieurs clés primaires dans postgres?

Tu ne peux pas. C'est un oxymore - la définition d'une clé primaire est que c'est la clé primaire, singulière. Vous ne pouvez pas en avoir plus d'un.

Vous pouvez avoir plusieurs uniquecontraintes. Vous pouvez avoir une clé primaire qui contient plusieurs colonnes (une clé primaire composite). Mais vous ne pouvez pas avoir plus d'une clé primaire pour une table.

Cependant, le code que vous montrez ne produit pas l'erreur que vous avez mentionnée:

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

À une supposition, vous avez déjà défini ce tableau et vous ignorez les erreurs précédentes, puis n'affichez que la dernière. Si je réexécute ce code, j'obtiens la sortie:

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

La vraie erreur ici est bien sûr la première.

Je recommande fortement de toujours utiliser -v ON_ERROR_STOP=1dans psql, par exemple:

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

Voyez comment cela s'arrête à la première erreur?

(Ce serait la valeur par défaut mais cela briserait la compatibilité descendante).

Craig Ringer
la source