繁体   English   中英

检查 PostgreSQL 中的 UNIQUE 约束违规时的 UNACCENT

[英]UNACCENT when checking for UNIQUE contraint violations in PostgreSQL

我们对表有一个UNIQUE约束,以防止我们的city_namestate_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 )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM