Là khóa chính
Thực hiện việc này nếu duy nhất đó là khóa chính:
create table tbl(
a_id int not null,
b_id int not null,
constraint tbl_pkey primary key(a_id,b_id)
);
Không phải khóa chính
Thực hiện việc này nếu duy nhất đó không phải là khóa chính:
create table tbl(
-- other primary key here, e.g.:
-- id serial primary key,
a_id int not null,
b_id int not null,
constraint tbl_unique unique(a_id,b_id)
);
Bảng hiện có
Nếu bạn có bảng hiện có, hãy thực hiện việc này thay thế:
alter table tbl
add constraint tbl_unique unique(a_id, b_id)
Bảng thay đổi đó hiển thị thông báo này:
NOTICE: ALTER TABLE / ADD UNIQUE will create implicit index "tbl_unique" for table "tbl"
Query returned successfully with no result in 22 ms.
Thả
Nếu bạn muốn loại bỏ ràng buộc đó (bạn có thể muốn tạo sự kết hợp duy nhất của 3 trường):
ALTER TABLE tbl DROP CONSTRAINT tbl_unique;
Chỉ mục &Ràng buộc &Nulls
Về chỉ mục, từ tài liệu Postgres:
Nguồn: http://www.postgresql.org/docs/9.1 /static/indexes-unique.html
Nếu tính duy nhất phụ thuộc vào một số quy tắc, bạn sẽ sử dụng CREATE UNIQUE INDEX
, ví dụ:
Đưa ra điều này:
CREATE TABLE tbl
(
a_id integer NOT NULL,
b_id integer NULL
);
alter table tbl
add constraint tbl_unique unique(a_id, b_id);
Duy nhất đó có thể bắt được các bản sao này, điều này sẽ bị cơ sở dữ liệu từ chối:
insert into tbl values
(1,1),
(1,1);
Tuy nhiên, CONSTRAINT DUY NHẤT đó không thể bắt được các giá trị null trùng lặp. Các null đóng vai trò là không xác định, chúng đóng vai trò là ký tự đại diện, đó là lý do tại sao nó được phép có nhiều null trong ràng buộc duy nhất. Điều này sẽ được cơ sở dữ liệu chấp nhận:
insert into tbl values
(1,1),
(1,null), -- think of this null as wildcard, some real value can be assigned later.
(1,null); -- and so is this. that's why both of these nulls are allowed
Hãy nghĩ về UNIQUE CONSTRAINT
rằng nó cho phép tính duy nhất được hoãn lại, do đó chấp nhận các giá trị rỗng ở trên.
Nếu bạn chỉ muốn có một ký tự đại diện (null b_id) cho mỗi a_id, ngoài ràng buộc duy nhất, bạn cần thêm một UNIQUE INDEX
. UNIQUE CONSTRAINT không thể có biểu thức trên chúng. INDEX
và UNIQUE INDEX
có thể. Đây sẽ là DDL hoàn chỉnh của bạn để từ chối nhiều null;
Đây sẽ là DDL hoàn chỉnh của bạn:
CREATE TABLE tbl
(
a_id integer NOT NULL,
b_id integer NULL
);
alter table tbl
add constraint tbl_unique unique(a_id, b_id);
create unique index tbl_unique_a_id on tbl(a_id) where b_id is null;
Điều này sẽ bị cơ sở dữ liệu của bạn từ chối ngay bây giờ:
insert into tbl values
(1,1),
(1,null),
(1,null);
Điều này sẽ được cho phép:
insert into tbl values
(1,1),
(1,null);
Liên quan đến http://www.ienablemuch .com / 2010/12 / postgresql-said-sql-server2008-said-non.html