วิธีการเลื่อนระดับดัชนีที่มีอยู่เป็นคีย์หลักใน PostgreSQL


13

ฉันรู้วิธีสร้างคีย์หลักภายในตาราง แต่ฉันจะสร้างดัชนีที่มีอยู่เป็นคีย์หลักได้อย่างไร ฉันพยายามที่จะคัดลอกตารางที่มีอยู่จากฐานข้อมูลหนึ่งไปยังอีก เมื่อฉันแสดงตารางดัชนีที่ด้านล่างจะอยู่ในรูปแบบนี้:

"my_index" PRIMARY KEY, btree (column1, column2)

ฉันได้สร้างดัชนีโดย:

CREATE INDEX my_index ON my_table (column1, column2)

แต่ฉันไม่ทราบวิธีการทำให้เป็นคีย์หลัก ...

อัปเดต: เวอร์ชันของเซิร์ฟเวอร์ของฉันคือ 8.3.3


1
หาก my_index แสดงเป็นชื่อของคีย์หลักแสดงว่าคุณมีดัชนีอยู่แล้ว ไม่มี PK ที่ไม่มีดัชนี (ไม่ซ้ำกัน) ใน Postgres
a_horse_with_no_name

1
รุ่น PostgreSQL ของคุณคืออะไร
filiprem

ฉันใช้ 8.3.3
WildBill

คำตอบ:


16

คุณต้องการใช้เปลี่ยนแปลงตารางการเพิ่มคีย์หลักข้อ จำกัด ใน Postgres คุณสามารถ "เลื่อนระดับ" ดัชนีโดยใช้ALTER TABLE .. ADD table_constraint_using_indexแบบฟอร์ม ""

หมายเหตุดัชนีต้องไม่ซ้ำกันแน่นอนสำหรับคีย์หลัก

ALTER TABLE my_table 
    ADD CONSTRAINT PK_my_table PRIMARY KEY USING INDEX my_index;

นั่นไม่ได้ผลสำหรับฉัน PK_my_table คืออะไร ฉันถือว่านี่เป็นป้ายกำกับและฉันผนวก 'PK_' เข้ากับชื่อของตารางของฉัน ฉันได้รับข้อผิดพลาดทางไวยากรณ์ว่า "ข้อผิดพลาด: ข้อผิดพลาดทางไวยากรณ์ที่หรือใกล้" การใช้ "ที่ตัวอักษร 83"
WildBill

1
@ngramsky: USING INDEXให้บริการตั้งแต่ 9.1 ดังนั้นฉันเดาว่าคุณไม่ได้ใช้งานเวอร์ชันปัจจุบัน
a_horse_with_no_name

ไม่ฉันใช้ 8.3.3 ฉันจะทำสิ่งนั้นในข้อ 8.3.3 ได้อย่างไร
WildBill

5
วิธีเดียวที่จะทำในรุ่นโบราณนั้นคือการวางดัชนีและเพิ่มข้อ จำกัด pk ใหม่
a_horse_with_no_name

2
@a_horse_with_no_name: คุณควรตอบคำถามนี้: ความคิดเห็นของคุณมีคำตอบอื่นมาก่อน ...
gbn

7

ฉันไม่คิดว่าเป็นไปได้ที่จะแปลงดัชนีเป็นคีย์หลักในรุ่น postgresql

ฉันจะวางดัชนีที่มีอยู่และสร้างคีย์หลักโดยใช้คอลัมน์ที่คุณระบุ:

DROP INDEX my_index;
ALTER TABLE ONLY my_table ADD CONSTRAINT pk_my_table PRIMARY KEY(column1,column2);

ทำงานใน 7.4 และ 8.4


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