Sql 如何将空字符串设为空值,以允许在可选字段中重复空字符串?

Sql 如何将空字符串设为空值,以允许在可选字段中重复空字符串?,sql,postgresql,unique-constraint,unique-key,Sql,Postgresql,Unique Constraint,Unique Key,我有一个可选的电子邮件字段。正则表达式可以很好地接受空字符串(^$),但现在的问题是空字符串被认为是唯一的条目。它只允许一个用户注册而不输入电子邮件地址。我知道我必须将其设置为null,但不确定如何设置 大概是这样的: 您可以使用: 创建唯一索引idx_unq_tab_email ON tab(email),其中TRIM(email)'; 这样,您仍然有唯一的约束加上原始值。创建一个触发器,在插入或更新时将空格转换为null: create trigger null_email befor

我有一个可选的电子邮件字段。正则表达式可以很好地接受空字符串(^$),但现在的问题是空字符串被认为是唯一的条目。它只允许一个用户注册而不输入电子邮件地址。我知道我必须将其设置为null,但不确定如何设置

大概是这样的:

您可以使用:

创建唯一索引idx_unq_tab_email ON tab(email),其中TRIM(email)';


这样,您仍然有
唯一的
约束加上原始值。

创建一个触发器,在插入或更新时将空格转换为null:

create trigger null_email
before insert or update on users
for each row
new.email = nullif(old.email, '')
或在插入时将空格转换为空:

insert into users (..., email, ...)
values (..., nullif(?, ''), ...)

触发器是更好的方法,因为它处理来自任何源的数据,而方法2要求每个应用程序的insert/update SQL都符合“无空格”规则。

您是说将字段设置为
null
会起作用吗?如果是这样,那你为什么不这样做呢?这样做的缺点是所有
电子邮件都是空的
查询必须变成
电子邮件是空的或修剪(email)='
。我认为从长远来看,如果你在把数据放进表格之前先整理好数据,你会过得更好。我同意你的观点,用部分索引来掩盖问题似乎是一种不断给予的礼物(悲伤和困惑)。
insert into users (..., email, ...)
values (..., nullif(?, ''), ...)