powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как создать уникальный составной индекс, который может содержать null значение
4 сообщений из 4, страница 1 из 1
Как создать уникальный составной индекс, который может содержать null значение
    #39494920
Oleg-san
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!
Вопрос: как запретить на уровне БД возможность вставки одинаковый записей.
Собственно сама таблица:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE "public"."test" (
    "name" text COLLATE "default" NOT NULL,
    "parent_id" int4,
    "id" SERIAL PRIMARY KEY
)
WITH (OIDS=FALSE);
ALTER TABLE "public"."test" OWNER TO "postgres";

CREATE INDEX "test_name" ON "public"."test" USING btree ("name");
CREATE UNIQUE INDEX "test_name1" ON "public"."test" USING btree ("name", "parent_id") WHERE parent_id IS NOT NULL;
CREATE UNIQUE INDEX "test_name2" ON "public"."test" USING btree ("name", "parent_id") WHERE parent_id IS NULL;


Выше описанная таблица позволяет добавлять одинаковые записи:
Код: plsql
1.
2.
INSERT INTO test (name) VALUES ('test');
INSERT INTO test (name) VALUES ('test');


Хотя если я правильно понимаю, во время попытки добавления второй раз записи должен был сработать индекс test_name2, но он почему-то не сработал.
И появляется главный и самый важный вопрос: почему не сработал индекс test_name2 и как сделать так что бы сработал?)
...
Рейтинг: 0 / 0
Как создать уникальный составной индекс, который может содержать null значение
    #39494925
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg-san,

согласно SQL стандарту, null никогда не может быть равен null'у. Поэтому уникальный индекс по полю, которое всегда в этом индексе является null'ом - штука удивительно бесполезная.
...
Рейтинг: 0 / 0
Как создать уникальный составной индекс, который может содержать null значение
    #39494930
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg-sanХотя если я правильно понимаю, во время попытки добавления второй раз записи должен был сработать индекс test_name2, но он почему-то не сработал.
И появляется главный и самый важный вопрос: почему не сработал индекс test_name2 и как сделать так что бы сработал?)

Сделать вместо
Код: plsql
1.
CREATE UNIQUE INDEX "test_name2" ON "public"."test" USING btree ("name", "parent_id") WHERE parent_id IS NULL;


индекс
Код: plsql
1.
CREATE UNIQUE INDEX "test_name2" ON "public"."test" USING btree ("name") WHERE parent_id IS NULL;



И все получится.

--
Maxim Boguk
dataegret.ru
...
Рейтинг: 0 / 0
Как создать уникальный составной индекс, который может содержать null значение
    #39494974
Oleg-san
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

Спасибо, то что нужно)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как создать уникальный составной индекс, который может содержать null значение
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]