Várias chaves primárias no PostgreSQL

13

Eu tenho a seguinte tabela:

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 tento restaurá-lo usando o seguinte comando:

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

isso me dá este erro:

várias chaves primárias para a tabela "word" não são permitidas

Como posso usar várias chaves primárias no postgres?

mostafa
fonte

Respostas:

26

como posso usar várias chaves primárias no postgres?

Você não pode. É um oxímoro - a definição de uma chave primária é que é a chave primária, singular. Você não pode ter mais de um.

Você pode ter várias uniquerestrições. Você pode ter uma chave primária que contenha várias colunas (uma chave primária composta). Mas você não pode ter mais de uma chave primária para uma tabela.

No entanto, o código que você mostra não produz o erro que você mencionou:

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

Suponho que você já tenha definido essa tabela e ignorando os erros anteriores, mostrando apenas o último. Se eu reexecutar esse código, obtenho a saída:

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

O verdadeiro erro aqui é o primeiro, é claro.

Eu recomendo sempre o uso -v ON_ERROR_STOP=1de psql, por exemplo:

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

Veja como ele pára no primeiro erro?

(Seria o padrão, mas isso quebraria a compatibilidade com versões anteriores).

Craig Ringer
fonte