sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgres unikke indeks med flere kolonner til sammenføjningstabel

Som primær nøgle

Gør dette, hvis den unikke er primærnøgle:

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

Ikke primær nøgle

Gør dette, hvis den unikke er en ikke-primær nøgle:

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

Eksisterende tabel

Hvis du har en eksisterende tabel, skal du gøre dette i stedet:

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

Denne ændringstabel viser denne meddelelse:

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


Query returned successfully with no result in 22 ms.

Slip

Hvis du ville slippe denne begrænsning (du vil måske lave en unik kombination af 3 felter):

ALTER TABLE tbl DROP CONSTRAINT tbl_unique;

Indeks &begrænsning &nuller

Angående indeks, fra Postgres doc:

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

Hvis unikhed afhænger af nogle regler, skal du bruge CREATE UNIQUE INDEX , for eksempel:

Givet dette:

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

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

Det unikke kan fange disse dubletter, dette vil blive afvist af databasen:

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

Alligevel kan den UNIKE BEGRÆNSNING ikke fange duplikerede nuller. Nuller fungerer som ukendte, de fungerer som jokertegn, det er derfor, det er tilladt at have flere nuller i en unik begrænsning. Dette vil blive accepteret af 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 at det tillader udskudt unikhed, derfor accepten af ​​nulværdier ovenfor.

Hvis du kun vil have ét jokertegn (null b_id) pr. a_id, bortset fra den unikke begrænsning, skal du tilføje et UNIQUE INDEX . UNIQUE CONSTRAINT kan ikke have et udtryk på dem. INDEX og UNIQUE INDEX kan. Dette vil være din komplette DDL for at afvise flere null;

Dette vil være din komplette 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;      

Dette vil blive afvist af din database nu:

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

Dette vil være tilladt:

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

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



  1. INSERT og transaktionsserialisering i PostreSQL

  2. Hvordan kan jeg abstrahere mysqli forberedte udsagn i PHP?

  3. Fra XML til liste over stier i Oracle PL/SQL-miljø

  4. Tablespaces i Oracle