Обсуждение: Re: [pgsql-ru-general] Частично уникальное поле
Приветствую,
--
// Dmitriy.
13 марта 2011 г. 1:41 пользователь Dmitry E. Oboukhov <unera@debian.org> написал:
Пользователь вводит некие данные.
Если он их не вводил, там NULL. Если он вводит эти данные, то они
должны быть уникальными между всеми введенными данными.
что-то я не пойму как построить ограничение, которое будет отслеживать
уникальность только между теми значениями что не NULL.
индекс построил
CREATE UNIQUE INDEX "tbli" ON "tbl" ("col") WHERE "col" IS NOT NULL;
а как построить CONSTRAINT? не хочется RULE приделывать
Чем вышеприведённый индекс не устраивает?
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera@debian.org jabber://UNera@uvw.ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
--
// Dmitriy.
DI> индекс построил DI> CREATE UNIQUE INDEX "tbli" ON "tbl" ("col") WHERE "col" IS NOT NULL; DI> а как построить CONSTRAINT? не хочется RULE приделывать DI> Чем вышеприведённый индекс не устраивает? а я попробовал в такую таблицу подобавлять записи с одинаковым 'col' - вполне нормально добавляются. хотя в документации написано что уникальный индекс контроллирует и вставку данных тоже. что-то толи я не так делаю, толи не так читаю, спать видимо пора... -- . ''`. Dmitry E. Oboukhov : :’ : email: unera@debian.org jabber://UNera@uvw.ru `. `~’ GPGKey: 1024D / F8E26537 2006-11-21 `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
Вложения
13 марта 2011 г. 2:13 пользователь Dmitry E. Oboukhov <unera@debian.org> написал:
DI> индекс построил
DI> CREATE UNIQUE INDEX "tbli" ON "tbl" ("col") WHERE "col" IS NOT NULL;
DI> а как построить CONSTRAINT? не хочется RULE приделывать
DI> Чем вышеприведённый индекс не устраивает?
а я попробовал в такую таблицу подобавлять записи с одинаковым 'col' -
вполне нормально добавляются. хотя в документации написано что
уникальный индекс контроллирует и вставку данных тоже.
Предполагаю, что ситуация подобна следующей:
dmitigr=> create table ttt(nm text);
CREATE TABLE
dmitigr=> create unique index ttt_uidx on ttt(nm) where nm notnull;
CREATE INDEX
dmitigr=> insert into ttt(nm) values('dima');
INSERT 0 1
dmitigr=> insert into ttt(nm) values('Dima');
INSERT 0 1
Если так, то нижеследующая команда может быть прольёт свет:
dmitigr=> create unique index ttt_uidx2 on ttt(lower(nm)) where nm notnull;
ERROR: could not create unique index "ttt_uidx2"
DETAIL: Key (lower(nm))=(dima) is duplicated.
dmitigr=> create table ttt(nm text);
CREATE TABLE
dmitigr=> create unique index ttt_uidx on ttt(nm) where nm notnull;
CREATE INDEX
dmitigr=> insert into ttt(nm) values('dima');
INSERT 0 1
dmitigr=> insert into ttt(nm) values('Dima');
INSERT 0 1
Если так, то нижеследующая команда может быть прольёт свет:
dmitigr=> create unique index ttt_uidx2 on ttt(lower(nm)) where nm notnull;
ERROR: could not create unique index "ttt_uidx2"
DETAIL: Key (lower(nm))=(dima) is duplicated.
что-то толи я не так делаю, толи не так читаю, спать видимо пора...
--
. ''`. Dmitry E. Oboukhov
: :’ : email: unera@debian.org jabber://UNera@uvw.ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
--
// Dmitriy.