PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Postgres chỉ mục nhiều cột duy nhất cho bảng tham gia

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. INDEXUNIQUE 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tính tổng tích lũy hàng ngày trong PostgreSQL

  2. Tại sao bạn nên học PostgreSQL?

  3. Cách nhập tệp ZIpped vào Bảng Postgres

  4. Tên cột và kiểu dữ liệu cho các dạng xem cụ thể hóa trong PostgreSQL?

  5. Làm cách nào để gọi đúng các hàm PostgreSQL (các thủ tục được lưu trữ) trong Spring / Hibernate / JPA?