【发布时间】:2013-05-30 03:25:30
【问题描述】:
在 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 内容相同但大写的附加列,在每次更新/插入后通过触发器进行更新,然后在此人工列上创建可延迟的唯一约束。然而,这听起来像一个非常丑陋的 hack。
或者,应该可以使用CREATE CONSTRAINT TRIGGER 并手动检查不区分大小写的唯一性(当然仍然需要常规索引)。对于如此简单(我想也很流行)的要求,这听起来有点过于复杂了。
有没有更简单和/或更优雅的方法来解决这个限制?
【问题讨论】:
-
你的 Postgres 版本?
-
目前是 9.1。但是,如果在较新的版本上有一个不错的解决方案,我会非常乐意阅读它:)
-
检查
EXCLUDE约束。它们可以设置为不区分大小写的UNIQUE。 -
+1 非常有趣的问题!
-
@Igor 谢谢,这很有趣——我不知道
EXCLUDE的限制(可能没有花足够的时间处理 9.x 文档)。我发现它在其他情况下也非常有用。
标签: postgresql constraints database-indexes