Làm cách nào để quảng cáo một chỉ mục hiện có lên khóa chính trong PostgreSQL


13

Tôi biết cách tạo khóa chính trong bảng, nhưng làm cách nào để tạo chỉ mục hiện có làm khóa chính? Tôi đang cố gắng sao chép một bảng hiện có từ cơ sở dữ liệu này sang cơ sở dữ liệu khác. Khi tôi hiển thị bảng, chỉ mục ở dưới cùng ở dạng này:

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

Tôi đã tạo chỉ mục với:

CREATE INDEX my_index ON my_table (column1, column2)

Nhưng tôi không biết làm thế nào để biến nó thành khóa chính ...

CẬP NHẬT: Phiên bản máy chủ của tôi là 8.3.3


1
Nếu my_index được hiển thị là tên của khóa chính thì bạn đã một chỉ mục. Không có PK mà không có chỉ mục (duy nhất) trong Postgres
a_horse_with_no_name

1
phiên bản PostgreSQL của bạn là gì?
filiprem

Tôi đang chạy 8.3.3
WildBill

Câu trả lời:


16

Bạn sẽ sử dụng ALTER TABLE để thêm ràng buộc khóa chính . Trong Postgres, bạn có thể "quảng bá" một chỉ mục bằng cách sử dụng ALTER TABLE .. ADD table_constraint_using_indexbiểu mẫu ""

Lưu ý, tất nhiên chỉ mục là duy nhất cho khóa chính

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

Điều đó đã không làm việc cho tôi. PK_my_table là gì? Tôi cho rằng đây là nhãn và tôi gắn 'PK_' vào tên bảng của mình? Tôi đã gặp lỗi cú pháp khi nói "LRI: lỗi cú pháp tại hoặc gần" SỬ DỤNG "ở ký tự 83"
WildBill

1
@ngramsky: USING INDEXcó sẵn từ 9.1. Vì vậy, tôi đoán bạn không chạy phiên bản hiện tại
a_horse_with_no_name

Không, tôi đang sử dụng 8.3.3 Tôi sẽ thực hiện việc đó như thế nào trong 8.3.3?
WildBill

5
Cách duy nhất để làm điều đó trong phiên bản cổ đó là bỏ chỉ mục và thêm một ràng buộc pk mới.
a_horse_with_no_name

2
@a_horse_with_no_name: bạn nên đưa ra câu trả lời: bình luận của bạn có trước câu trả lời khác ...
gbn

7

Tôi không nghĩ có thể chuyển đổi một chỉ mục thành khóa chính trong phiên bản postgresql đó.

Tôi sẽ chỉ bỏ chỉ mục hiện có và tạo khóa chính bằng các cột bạn đã chỉ định.:

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

Làm việc trong 7.4 và 8.4


btw, "Nếu CHỈ được chỉ định trước tên bảng, chỉ bảng đó bị thay đổi. Nếu CHỈ không được chỉ định, bảng và tất cả các bảng con cháu của nó (nếu có) sẽ bị thay đổi."
Paolo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.