sql >> Databáze >  >> RDS >> PostgreSQL

Jedinečný vícesloupcový index Postgres pro tabulku spojení

Jako primární klíč

Udělejte to, pokud je tento jedinečný primární klíč:

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

Není primární klíč

Udělejte to, pokud tento jedinečný klíč není primární:

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

Stávající tabulka

Pokud máte existující tabulku, udělejte místo toho toto:

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

Tato alter tabulka zobrazí tuto zprávu:

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


Query returned successfully with no result in 22 ms.

Vypustit

Pokud byste chtěli toto omezení zrušit (možná budete chtít vytvořit jedinečnou kombinaci 3 polí):

ALTER TABLE tbl DROP CONSTRAINT tbl_unique;

Index a omezení a hodnoty Null

Pokud jde o index, z dokumentu Postgres:

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

Pokud jedinečnost závisí na některých pravidlech, použijte CREATE UNIQUE INDEX , například:

Vzhledem k tomu:

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

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

Tento jedinečný může zachytit tyto duplikáty, bude to odmítnuto databází:

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

Přesto toto UNIQUE CONSTRAINT nedokáže zachytit duplicitní hodnoty null. Hodnoty Null slouží jako neznámé, slouží jako zástupný znak, proto je povoleno mít více hodnot null v jedinečném omezení. Toto bude přijato databází:

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

Vzpomeňte si na UNIQUE CONSTRAINT že umožňuje odloženou jedinečnost, tedy přijetí výše uvedených hodnot null.

Pokud chcete pouze jeden zástupný znak (null b_id) na a_id, kromě jedinečného omezení, musíte přidat UNIQUE INDEX . UNIQUE CONSTRAINT na ně nemůže mít výraz. INDEX a UNIQUE INDEX umět. Toto bude vaše úplné DDL pro odmítnutí vícenásobných hodnot null;

Toto bude vaše kompletní 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;      

Toto bude nyní vaší databází odmítnuto:

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

To bude povoleno:

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

Souvisí s http://www.ienablemuch .com/2010/12/postgresql-said-sql-server2008-said-non.html



  1. Znovu použijte připojení MySQL Dědičnost objektů PHP

  2. Uložit výsledky dotazu SQLite do textového souboru

  3. Protokol SQL Server 2008 se nezkrátí

  4. Sequelize hasMany, PatriTo, nebo obojí?