PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Postgres уникален многоколонен индекс за таблица за присъединяване

Като първичен ключ

Направете това, ако този уникален е първичен ключ:

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

Не е първичен ключ

Направете това, ако този уникален ключ не е първичен:

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

Съществуваща таблица

Ако имате съществуваща таблица, направете това вместо това:

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

Тази таблица за промяна показва това съобщение:

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


Query returned successfully with no result in 22 ms.

Пуснете

Ако искате да премахнете това ограничение (може да искате да направите уникална комбинация от 3 полета):

ALTER TABLE tbl DROP CONSTRAINT tbl_unique;

Индекс &Ограничение &Нули

Относно индекса, от Postgres doc:

Източник:http://www.postgresql.org/docs/9.1 /static/indexes-unique.html

Ако уникалността зависи от някои правила, трябва да използвате CREATE UNIQUE INDEX , например:

Предвид това:

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

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

Този уникален може да улови тези дубликати, това ще бъде отхвърлено от базата данни:

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

И все пак това UNIQUE CONSTRAINT не може да улови дублирани нули. Нулите служат като неизвестни, те служат като заместващ знак, затова е позволено да има множество нули в уникално ограничение. Това ще бъде прието от базата данни:

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

Помислете за UNIQUE CONSTRAINT че позволява отложена уникалност, следователно приемането на нулеви стойности по-горе.

Ако искате само един заместващ знак (null b_id) за a_id, освен уникалното ограничение, трябва да добавите UNIQUE INDEX . УНИКАЛНО ОГРАНИЧЕНИЕ не може да има израз върху тях. INDEX и UNIQUE INDEX мога. Това ще бъде вашият пълен DDL за отхвърляне на множество null;

Това ще бъде вашият пълен 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;      

Това ще бъде отхвърлено от вашата база данни сега:

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

Това ще бъде разрешено:

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

Свързано с http://www.ienablemuch .com/2010/12/postgresql-said-sql-server2008-said-non.html



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Задайте лимит по подразбиране за pg_trgm

  2. Как да открием заявка, която държи заключването в Postgres?

  3. Таблица като аргумент на функция на PostgreSQL

  4. Съставният ПЪРВИЧЕН КЛЮЧ налага ограничения NOT NULL върху участващите колони

  5. Влезли сте като postgres, но получавате грешка createuser:създаването на нова роля е неуспешно:ГРЕШКА:трябва да сте суперпотребител, за да създавате суперпотребители