Кілька первинних ключів у 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
$

Подивіться, як вона зупиняється при першій помилці?

(Це було б за замовчуванням, але це порушило б сумісність).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.