sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgres unika flerkolumnsindex för sammanfogningstabell

Som primär nyckel

Gör detta om den unika är primärnyckeln:

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

Inte primärnyckel

Gör detta om den unika nyckeln inte är primär:

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

Befintlig tabell

Om du har en befintlig tabell, gör så här istället:

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

Den ändringstabellen visar detta meddelande:

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


Query returned successfully with no result in 22 ms.

Släpp

Om du ville släppa den begränsningen (du kanske vill göra unik en kombination av 3 fält):

ALTER TABLE tbl DROP CONSTRAINT tbl_unique;

Index &begränsning &nollvärden

Angående index, från Postgres doc:

Källa:http://www.postgresql.org/docs/9.1 /static/indexes-unique.html

Om unikhet beror på vissa regler, ska du använda CREATE UNIQUE INDEX , till exempel:

Med tanke på detta:

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

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

Den unika kan fånga dessa dubbletter, detta kommer att avvisas av databasen:

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

Ändå kan den UNIKA BEGRÄNSNINGEN inte fånga dubbla nollor. Nulls fungerar som okända, de fungerar som jokertecken, det är därför det är tillåtet att ha flera nollor i unika begränsningar. Detta kommer att accepteras av databasen:

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

Tänk på UNIQUE CONSTRAINT att det tillåter uppskjuten unikhet, därav acceptansen av nollvärden ovan.

Om du bara vill ha ett jokertecken (null b_id) per a_id, förutom den unika begränsningen, måste du lägga till ett UNIQUE INDEX . UNIQUE CONSTRAINT kan inte ha ett uttryck på dem. INDEX och UNIQUE INDEX burk. Detta kommer att vara din fullständiga DDL för att avvisa flera null;

Detta kommer att vara din fullständiga 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;      

Detta kommer att avvisas av din databas nu:

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

Detta kommer att tillåtas:

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

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



  1. Hur man infogar nästa högsta nummer i databasen

  2. node-mysql-fel:anslut ECONNREFUSED

  3. Ta bort standardspåret – Del 2

  4. Hur minskar man resultatrader med SQL-fråga lika mycket i hela intervallet?