加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – 可延迟,不区分大小写的唯一约束

发布时间:2020-12-13 16:32:32 所属栏目:百科 来源:网络整理
导读:在PostgreSQL中是否可以在字符列上创建一个可延迟的唯一约束,但不区分大小写? 我们假设下列基本表: CREATE TABLE sample_table ( my_column VARCHAR(100)); 如果不需要延迟约束,就像创建具有函数的唯一索引一样简单,例如: CREATE UNIQUE INDEX my_unique_
在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并手动检查不区分大小写的唯一性(当然,常规索引仍然是必需的).对于这样一个简单的(我认为是这样)的要求,这听起来有点复杂.

有没有更简单和/或更优雅的方式来解决这个限制?

您可以使用同名附加模块提供的特殊类型 citext来规避限制.引用手册:

The citext module provides a case-insensitive character string type,
citext. Essentially,it internally calls lower when comparing values.
Otherwise,it behaves almost exactly like text.

它完全符合你的情况.每个数据库运行一次:

CREATE EXTENSION citext;

然后你可以:

CREATE TABLE sample_table ( 
   my_column citext,CONSTRAINT my_unique_constraint UNIQUE(my_column)
   DEFERRABLE INITIALLY IMMEDIATE
);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读