sql >> Database >  >> RDS >> PostgreSQL

Postgres unieke index met meerdere kolommen voor samenvoegtabel

Als primaire sleutel

Doe dit als die unieke primaire sleutel is:

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

Geen primaire sleutel

Doe dit als die unieke niet-primaire sleutel is:

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

Bestaande tabel

Als u een bestaande tabel heeft, doet u dit in plaats daarvan:

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

Die wijzigingstabel geeft dit bericht weer:

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


Query returned successfully with no result in 22 ms.

Laat vallen

Als je die beperking wilt laten vallen (je wilt misschien een combinatie van 3 velden uniek maken):

ALTER TABLE tbl DROP CONSTRAINT tbl_unique;

Index &beperking &nulwaarden

Betreffende index, van Postgres-document:

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

Als uniciteit van bepaalde regels afhangt, gebruikt u CREATE UNIQUE INDEX , bijvoorbeeld:

Gezien dit:

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

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

Die unieke kan deze duplicaten opvangen, dit wordt door de database afgewezen:

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

Maar die UNIEKE BEPERKING kan geen dubbele nulls opvangen. Nulls dienen als onbekend, ze dienen als wildcard, daarom is het toegestaan ​​om meerdere nulls te hebben met een unieke beperking. Dit wordt geaccepteerd door de 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

Denk aan UNIQUE CONSTRAINT dat het uitgestelde uniciteit mogelijk maakt, vandaar de acceptatie van null-waarden hierboven.

Als u slechts één jokerteken (null b_id) per a_id wilt, moet u, afgezien van de unieke beperking, een UNIQUE INDEX toevoegen . UNIQUE CONSTRAINT kan er geen uitdrukking op hebben. INDEX en UNIQUE INDEX kan. Dit wordt je volledige DDL voor het afwijzen van meerdere nulls;

Dit wordt je volledige 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;      

Dit wordt nu afgewezen door uw database:

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

Dit is toegestaan:

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

Gerelateerd aan http://www.ienablemuch .com/2010/12/postgresql-said-sql-server2008-said-non.html



  1. PostgreSQL instellen met Laravel in MAMP

  2. Controleer of Tomcat en MySQL al op de machine zijn geïnstalleerd

  3. Mysql-query met mysql-variabele werkt niet in Zend Framework 1

  4. Selecteer / voeg een versie van een Upsert in:is er een ontwerppatroon voor hoge gelijktijdigheid?