【问题标题】:How to make empty string as null value to allow duplicate empty strings in optional field?如何将空字符串设为空值以允许可选字段中出现重复的空字符串?
【发布时间】:2018-08-11 17:34:28
【问题描述】:

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

类似这样的:

Duplicate entry '' for key 'users_email_unique' empty field

Error: Duplicate entry '' for key 'email'

【问题讨论】:

  • 您是说将字段设置为null 会起作用吗?如果是这样,那你为什么不这样做呢?

标签: sql postgresql unique-constraint unique-key


【解决方案1】:

你可以使用partial index:

CREATE UNIQUE INDEX idx_unq_tab_email ON tab(email) WHERE TRIM(email) <> '';

DBFiddle Demo

这样你仍然有UNIQUE约束加上原始值。

【讨论】:

  • 这样做的缺点是所有email is null 查询都必须变成email is null or trim(email) = ''。我认为从长远来看,如果您在将数据放入表格之前清理数据会更好。
【解决方案2】:

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

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 将要求每个应用程序的插入/更新 SQL 符合“无空白”规则。

【讨论】:

  • 我同意你的观点,用部分索引掩盖问题似乎是一份不断给予的礼物(悲伤和困惑)。
猜你喜欢
  • 2019-07-16
  • 2014-06-21
  • 1970-01-01
  • 2017-06-12
  • 2018-08-11
  • 2015-10-04
  • 2015-12-09
  • 2019-08-04
  • 2012-08-13
相关资源
最近更新 更多