Отложенное, без учета регистра уникальное ограничение
Возможно ли в PostgreSQL создать отложенное уникальное ограничение для символьного столбца, но без учета регистра?
Давайте предположим следующую базовую таблицу:
CREATE TABLE sample_table (
my_column VARCHAR(100)
);
Если отложенное ограничение не требуется, это так же просто, как создать уникальный индекс с помощью функции, например:
CREATE UNIQUE INDEX my_unique_index ON sample_table(UPPER(my_column));
Отложенная проверка ограничений требует явного создания ограничения, например:
ALTER TABLE sample_table
ADD CONSTRAINT my_unique_constraint UNIQUE(my_column)
DEFERRABLE INITIALLY IMMEDIATE;
И, к сожалению, невозможно использовать произвольные функции в уникальном ограничении.
Одним из возможных путей решения этой проблемы является создание дополнительного столбца с тем же содержанием, что иmy_column
, но верхний регистр, обновляется через триггер после каждого обновления / вставки, а затем создает отложенное уникальное ограничение для этого искусственного столбца. Это, однако, звучит как действительно уродливый хак.
Альтернативно, должно быть возможно использоватьCREATE CONSTRAINT TRIGGER
и вручную проверить уникальность без учета регистра (конечно, регулярный индекс все еще будет необходим). Это звучит немного сложнее для такого простого (и, я полагаю, популярного) требования.
Есть ли более простой и / или более элегантный способ обойти это ограничение?