PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Eindeutiger mehrspaltiger Postgres-Index für die Join-Tabelle

Als Primärschlüssel

Tun Sie dies, wenn dieser eindeutige Primärschlüssel ist:

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

Kein Primärschlüssel

Tun Sie dies, wenn dieser eindeutige Nicht-Primärschlüssel ist:

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

Bestehende Tabelle

Wenn Sie eine vorhandene Tabelle haben, tun Sie stattdessen Folgendes:

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

Diese Änderungstabelle zeigt diese Nachricht an:

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


Query returned successfully with no result in 22 ms.

Ablegen

Wenn Sie diese Einschränkung aufheben möchten (vielleicht möchten Sie eine Kombination aus 3 Feldern eindeutig machen):

ALTER TABLE tbl DROP CONSTRAINT tbl_unique;

Index &Einschränkung &Nullen

In Bezug auf den Index aus dem Postgres-Dokument:

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

Wenn die Eindeutigkeit von einigen Regeln abhängt, verwenden Sie CREATE UNIQUE INDEX , zum Beispiel:

Angesichts dessen:

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

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

Dieser Unique kann diese Duplikate abfangen, dies wird von der Datenbank abgelehnt:

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

Diese EINZIGARTIGE EINSCHRÄNKUNG kann jedoch keine doppelten Nullen abfangen. Nullen dienen als unbekannt, sie dienen als Platzhalter, deshalb ist es erlaubt, mehrere Nullen in Unique Constraint zu haben. Dies wird von der Datenbank akzeptiert:

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

Denken Sie an UNIQUE CONSTRAINT dass es verzögerte Eindeutigkeit zulässt, daher die Annahme von Nullwerten oben.

Wenn Sie nur einen Platzhalter (null b_id) pro a_id wollen, müssen Sie neben der Eindeutigkeitsbeschränkung einen UNIQUE INDEX hinzufügen . UNIQUE CONSTRAINT kann keinen Ausdruck enthalten. INDEX und UNIQUE INDEX kann. Dies ist Ihre vollständige DDL zum Zurückweisen mehrerer Nullen;

Dies wird Ihre vollständige DDL sein:

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;      

Dies wird jetzt von Ihrer Datenbank abgelehnt:

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

Dies wird erlaubt:

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

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