PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Indeks multi-kolom unik Postgres untuk tabel gabungan

Sebagai Kunci Utama

Lakukan ini jika unik itu adalah kunci utama:

create table tbl(
   a_id int not null,
   b_id int not null,
   constraint tbl_pkey primary key(a_id,b_id)
);

Bukan Kunci Utama

Lakukan ini jika unik itu bukan kunci utama:

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)
);

Tabel yang Ada

Jika Anda sudah memiliki tabel, lakukan ini sebagai gantinya:

alter table tbl
      add constraint tbl_unique unique(a_id, b_id)

Tabel perubahan itu menampilkan pesan ini:

NOTICE:  ALTER TABLE / ADD UNIQUE will create implicit index "tbl_unique" for table "tbl"


Query returned successfully with no result in 22 ms.

Lepas

Jika Anda ingin menghilangkan batasan itu (Anda mungkin ingin membuat kombinasi unik dari 3 bidang):

ALTER TABLE tbl DROP CONSTRAINT tbl_unique;

Indeks &Batasan &Nulls

Mengenai indeks, dari dokumen Postgres:

Sumber:http://www.postgresql.org/docs/9.1 /static/indexes-unique.html

Jika keunikan tergantung pada beberapa aturan, Anda harus menggunakan CREATE UNIQUE INDEX , misalnya:

Mengingat ini:

CREATE TABLE tbl
(
  a_id integer NOT NULL,
  b_id integer NULL  
);

alter table tbl
    add constraint tbl_unique unique(a_id, b_id);

Unik itu dapat menangkap duplikat ini, ini akan ditolak oleh database:

insert into tbl values
(1,1),
(1,1);

Namun UNIQUE CONSTRAINT tidak dapat menangkap null duplikat. Nulls berfungsi sebagai tidak diketahui, mereka berfungsi sebagai wildcard, itu sebabnya diizinkan untuk memiliki beberapa nol dalam batasan unik. Ini akan diterima oleh database:

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

Pikirkan UNIQUE CONSTRAINT bahwa itu memungkinkan keunikan yang ditangguhkan, maka penerimaan nilai nol di atas.

Jika Anda hanya menginginkan satu wildcard(null b_id) per a_id, selain dari batasan unik, Anda perlu menambahkan UNIQUE INDEX . CONSTRAINT UNIK tidak dapat memiliki ekspresi pada mereka. INDEX dan UNIQUE INDEX bisa. Ini akan menjadi DDL lengkap Anda untuk menolak banyak null;

Ini akan menjadi DDL lengkap Anda:

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;      

Ini akan ditolak oleh database Anda sekarang:

insert into tbl values
(1,1),
(1,null),
(1,null);

Ini akan diizinkan:

insert into tbl values
(1,1),
(1,null);

Terkait dengan 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. Solusi Ruby generik untuk SQLite3 LIKE atau PostgreSQL ILIKE?

  2. Kinerja Urutan dan Serial di Postgres-XL

  3. Impor file XML ke PostgreSQL

  4. PostgreSQL:Buat indeks pada panjang semua bidang tabel

  5. Mengapa saya mendapatkan kesalahan tidak dapat terhubung ke server untuk postgres di Mac OS Lion?