Несколько первичных ключей в PostgreSQL

13

У меня есть следующая таблица:

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

Когда я пытаюсь восстановить его, используя следующую команду:

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

это дает мне эту ошибку:

несколько первичных ключей для таблицы «слово» не допускаются

Как я могу использовать несколько первичных ключей в postgres?

Мостафа
источник

Ответы:

26

Как я могу использовать несколько первичных ключей в Postgres?

Ты не можешь Это оксюморон - определение первичного ключа является то , что это первичный ключ, единственным числа. Вы не можете иметь более одного.

Вы можете иметь несколько uniqueограничений. У вас может быть первичный ключ, который содержит несколько столбцов (составной первичный ключ). Но вы не можете иметь более одного первичного ключа для таблицы.

Тем не менее, код, который вы показываете, не производит ошибку, которую вы упомянули:

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

Возможно, вы уже определили эту таблицу и игнорируете предыдущие ошибки, а затем показывает только последнюю. Если я перезапущу этот код, я получу вывод:

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

Настоящая ошибка здесь, конечно, первая.

Я настоятельно рекомендую всегда использовать -v ON_ERROR_STOP=1в psql, например:

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

Видите, как это останавливается при первой ошибке?

(Это будет по умолчанию, но это нарушит обратную совместимость).

Крейг Рингер
источник