我们UNIQUE
对表有一个约束,以防止我们的city_name
和state_id
组合被重复。我们发现的问题是口音绕过了这一点。
示例:
"Montréal" "Quebec"
和
"Montreal" "Quebec"
我们需要一种方法来运行唯一约束,UNACCENT()
并且最好将其包装起来以LOWER()
进行良好的测量。这可能吗?
我们UNIQUE
对表有一个约束,以防止我们的city_name
和state_id
组合被重复。我们发现的问题是口音绕过了这一点。
示例:
"Montréal" "Quebec"
和
"Montreal" "Quebec"
我们需要一种方法来运行唯一约束,UNACCENT()
并且最好将其包装起来以LOWER()
进行良好的测量。这可能吗?
您可以创建一个不可变的版本unaccent
:
CREATE FUNCTION noaccent(text) RETURNS text
LANGUAGE sql IMMUTABLE STRICT AS
'SELECT unaccent(lower($1))';
并在列上的唯一索引中使用它。
另一种方法是使用BEGORE INSERT OR UPDATE
触发器,用非重音值填充新列并对该列施加唯一约束。
您可以在表达式上创建唯一索引,请参阅 Postgres 手册:
https://www.postgresql.org/docs/9.3/indexes-expressional.html
所以在你的情况下,它可能是这样的
CREATE UNIQUE INDEX idx_foo ON my_table ( UNACCENT(LOWER(city_name)), state_id )