在 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
和手动检查不区分大小写的唯一性(当然仍然需要常规索引)。对于这样一个简单(我想也很流行)的要求,这听起来有点过于复杂。
有没有更简单和/或更优雅的方法来解决这个限制?