2009-07-28 26 views
97

Tôi có bảng sau:Tôi có thể thêm một ràng buộc UNIQUE vào một bảng PostgreSQL, sau khi nó đã được tạo chưa?

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ó bao giờ có nhiều hơn một cột cho bất kỳ trao tickername/tickerbbname cặp. Tôi đã tạo bảng và có nhiều dữ liệu trong đó (mà tôi đã đảm bảo đáp ứng các tiêu chí duy nhất). Vì nó trở nên lớn hơn, tuy nhiên, phòng cho lỗi creep in.

Có cách nào để thêm ràng buộc UNIQUE vào thời điểm này không?

+0

thể trùng lặp của [Làm thế nào để ALTER một bảng PostgreSQL và thực hiện một cột duy nhất?] (Http://stackoverflow.com/questions/469471/how-do-i-alter-a-postgresql-table -and-make-a-column-unique) –

Trả lời

205

psql của inline giúp đỡ:

\h ALTER TABLE 

Cũng ghi nhận trong postgres docs (một nguồn tài nguyên tuyệt vời, cộng với dễ đọc, quá).

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns); 
+1

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

+54

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

+2

Tôi cần một câu trả lời cho 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ù đó là một suy nghĩ tốt để tham khảo các tài liệu chính thức, nó cũng rất tốt để cung cấp cho câu trả lời cho các lần truy cập trong tương lai. Cảm ơn vì điều đó. – Leonard

2

Có, bạn có thể thêm một hạn chế UNIQUE sau khi thực tế. Tuy nhiên, nếu bạn có các mục không duy nhất trong bảng của bạn, Postgres sẽ phàn nàn về nó cho đến khi bạn sửa chúng.

+3

'chọn từ

nhóm theo 1 có số (*)> 1;' sẽ cung cấp báo cáo về các giá trị trùng lặp. – Jasen

25

Có, bạn có thể. Nhưng nếu bạn có các mục không phải duy nhất trên bảng của bạn, nó sẽ thất bại. Đây là cách thêm ràng buộc duy nhất vào 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 dưới đây.

CREATE UNIQUE INDEX constraint_name ON table_name (columns); 
+3

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

+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ư "Khoá (uuid) = (3a533772-07ac-4e76-b577-27a3878e2222) được sao chép. Truy vấn không thành công" nếu bạn có giá trị không phải là duy nhất ... – Strinder

+1

@ Strinder, làm thế nào mà không phải là một điều tốt? trước tiên hãy sửa dữ liệu trùng lặp. – Jasen

0

Nếu bạn đã có một bảng mà đã có một trở ngại hiện tại dựa trên phép nói: tên và lastname và bạn muốn thêm một hạn chế duy nhất, bạn phải thả toàn bộ Constrain bởi:

ALTER TABLE your_table DROP CONSTRAINT constraint_name; 

Hãy chắc chắn tha 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ó có thể chứa chỉ một giá trị null) trên tất cả dữ liệu trên bảng đó, và sau đó bạn có thể tạo lại nó.

ALTER TABLE table_name 
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n); 
Các vấn đề liên quan