Като първичен ключ
Направете това, ако този уникален е първичен ключ:
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