Tôi có thể thêm một ràng buộc ĐỘC ĐÁO vào bảng PostgreSQL sau khi nó đã được tạo không?


185

Tôi có bảng sau:

 tickername | tickerbbname  | tickertype
------------+---------------+------------
 USDZAR     | USDZAR Curncy | C
 EURCZK     | EURCZK Curncy | C
 EURPLN     | EURPLN Curncy | C
 USDBRL     | USDBRL Curncy | C
 USDTRY     | USDTRY Curncy | C
 EURHUF     | EURHUF Curncy | C
 USDRUB     | USDRUB Curncy | C

Tôi không muốn có nhiều hơn một cột cho bất kỳ tickername/ tickerbbnamecặp nào. Tôi đã tạo bảng và có rất nhiều dữ liệu trong đó (mà tôi đã đảm bảo đáp ứng các tiêu chí duy nhất). Tuy nhiên, khi nó trở nên lớn hơn, có chỗ cho lỗi creep.

Có cách nào để thêm một UNIQUEràng buộc tại thời điểm này?


Câu trả lời:


362

psqlTrợ giúp nội tuyến:

\h ALTER TABLE

Cũng được ghi lại trong các tài liệu postgres (một tài nguyên tuyệt vời, cộng với dễ đọc, quá).

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);

6
cảm ơn @hhaamu. Yep đã thử các tài liệu nhưng ở trên của bạn ngắn gọn hơn nhiều.
Thomas Browne

117
Nếu bạn muốn để PostgreSQL tạo tên chỉ mục, hãy sử dụng ALTER TABLE tablename ADD UNIQUE (columns);. (Lưu ý rằng CONSTRAINTtừ khóa phải được bỏ qua.)
jpmc26

5
Tôi cần một câu trả lời cho chính câu hỏi này và bắt đầu googling cho các tài liệu. Thay vì tài liệu Postgres, tôi đã chạy vào chủ đề này tại StackOverflow. Vì vậy, mặc dù nên tham khảo các tài liệu chính thức, nhưng cũng rất tốt để đưa ra câu trả lời cho các chuyến thăm trong tương lai. Cảm ơn vì điều đó.
Leonard

@ jpmc26 «Nếu bạn muốn để PostgreSQL tạo tên chỉ mục» Ý bạn là tên ràng buộc?
tuxayo

4
@tuxayo, một ràng buộc duy nhất được triển khai thông qua một chỉ mục trong Postgres (không phải là mô phạm).
Chris W.

36

Vâng, bạn có thể. Nhưng nếu bạn có các mục không độc đáo trên bàn của mình, nó sẽ thất bại. Dưới đây là cách thêm các ràng buộc duy nhất trên bảng của bạn. Nếu bạn đang sử dụng PostgreSQL 9.x, bạn có thể làm theo hướng dẫn bên dưới.

CREATE UNIQUE INDEX constraint_name ON table_name (columns);

3
Cảm ơn Zeck - 2y trả lời tốt đẹp sau nhưng vẫn đánh giá cao rằng mọi người vẫn dành thời gian! Tom
Thomas Browne

1
Điều đó không đúng. Trong Postgres mới nhất, điều này cũng dẫn đến thông báo như "Key (uuid) = (3a533772-07ac-4e76-b577-27a3878e2222) được sao chép. Truy vấn thất bại" nếu bạn có một giá trị không phải là duy nhất ...
Truy cập

3
@Strinder, làm thế nào mà không phải là một điều tốt? sửa dữ liệu trùng lặp trước.
Jasen 26/8/2016

3
@Jasen Điều đó hoàn toàn rõ ràng. Chỉ muốn nhấn mạnh rằng câu trả lời "Nhưng nếu bạn có các mục không duy nhất trên bảng của mình. Đây là cách để thêm các ràng buộc duy nhất trên bảng của bạn." sẽ không làm việc. Tất nhiên các mục không phải là duy nhất phải luôn được hợp nhất trước.
Cuộc đình công

Chỉnh sửa câu trả lời cho rõ ràng
Xavier Ho

6

Nếu bạn đã có một bảng đã có các ràng buộc hiện có dựa trên giả sử: tên và họ và bạn muốn thêm một ràng buộc duy nhất, bạn phải loại bỏ toàn bộ ràng buộc bằng cách:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

Đảm bảo rằng ràng buộc mới mà bạn muốn thêm là duy nhất / không null (nếu Microsoft Sql của nó, nó chỉ có thể chứa một giá trị null) trên tất cả dữ liệu trên bảng đó, sau đó bạn có thể tạo lại nó.

ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);

5

Có, bạn có thể thêm một ràng buộc ĐỘC ĐÁO sau khi thực tế. Tuy nhiên, nếu bạn có các mục không độc đáo trong bảng, Postgres sẽ phàn nàn về điều đó cho đến khi bạn sửa chúng.


7
select <column> from <table> group by 1 having count(*) > 1;sẽ đưa ra một báo cáo về các giá trị trùng lặp.
Jasen
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.