คีย์หลักหลายตัวใน 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
$

มาดูกันว่ามันจะหยุดที่ข้อผิดพลาดแรก?

(มันจะเป็นค่าเริ่มต้น แต่นั่นจะทำลายความเข้ากันได้ย้อนหลัง)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.