PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Unikalny wielokolumnowy indeks Postgres dla tabeli dołączania

Jako klucz podstawowy

Zrób to, jeśli ten unikalny jest kluczem podstawowym:

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

Nie klucz podstawowy

Zrób to, jeśli ten unikatowy klucz nie jest kluczem podstawowym:

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

Istniejąca tabela

Jeśli masz już tabelę, zrób to:

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

Ta alternatywna tabela wyświetla następujący komunikat:

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


Query returned successfully with no result in 22 ms.

Upuść

Jeśli chcesz usunąć to ograniczenie (możesz chcieć stworzyć unikalną kombinację 3 pól):

ALTER TABLE tbl DROP CONSTRAINT tbl_unique;

Indeks i ograniczenia i wartości zerowe

Odnośnie indeksu, z dokumentu Postgres:

Źródło:http://www.postgresql.org/docs/9.1 /static/indexes-unique.html

Jeśli unikatowość zależy od pewnych reguł, użyj CREATE UNIQUE INDEX , na przykład:

Biorąc pod uwagę to:

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

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

Ten unikalny może wychwycić te duplikaty, zostanie to odrzucone przez bazę danych:

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

Jednak to UNIQUE CONSTRAINT nie może wyłapać zduplikowanych wartości null. Nulls są nieznane, służą jako symbol wieloznaczny, dlatego dozwolone jest posiadanie wielu wartości null w unikalnym ograniczeniu. Zostanie to zaakceptowane przez bazę danych:

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

Pomyśl o UNIQUE CONSTRAINT że pozwala na odroczoną unikatowość, stąd akceptacja wartości null powyżej.

Jeśli chcesz mieć tylko jeden symbol wieloznaczny (null b_id) na a_id, oprócz ograniczenia unikalności, musisz dodać UNIQUE INDEX . UNIQUE CONSTRAINT nie może mieć na nich wyrazu. INDEX i UNIQUE INDEX Móc. To będzie Twój kompletny plik DDL do odrzucania wielu wartości null;

To będzie Twój kompletny DDL:

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;      

To zostanie teraz odrzucone przez Twoją bazę danych:

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

Będzie to dozwolone:

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

Powiązane z 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. Jak uzyskać wyzwalacze powiązane z widokiem lub tabelą w PostgreSQL?

  2. Obce/akcentowane znaki w zapytaniu sql

  3. Dlaczego null JSON nie jest rzutowany na null SQL w postgresie?

  4. Postgresql próbuje użyć formatu wykonania w funkcji, ale otrzymuje błąd nie znaleziono kolumny podczas podawania formatu ciągu w koalescencji

  5. Jak zgłosić niestandardowy błąd Postgresql i obsłużyć go w Ecto?