如何将空字符串设为空值以允许在可选字段中重复空字符串?
How to make empty string as null value to allow duplicate empty strings in optional field?
我有一个可选的电子邮件字段。正则表达式可以很好地接受空字符串 (^$),但现在的问题是空字符串被视为唯一条目。它只允许一个用户在不输入电子邮件地址的情况下注册。我知道我必须将其设置为 null,但不确定如何设置。
像这样:
您可以使用 partial index:
CREATE UNIQUE INDEX idx_unq_tab_email ON tab(email) WHERE TRIM(email) <> '';
这样你仍然有 UNIQUE
约束加上原始值。
创建一个触发器,在插入或更新时将空白转换为空值:
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 符合 "no blanks" 规则。
我有一个可选的电子邮件字段。正则表达式可以很好地接受空字符串 (^$),但现在的问题是空字符串被视为唯一条目。它只允许一个用户在不输入电子邮件地址的情况下注册。我知道我必须将其设置为 null,但不确定如何设置。
像这样:
您可以使用 partial index:
CREATE UNIQUE INDEX idx_unq_tab_email ON tab(email) WHERE TRIM(email) <> '';
这样你仍然有 UNIQUE
约束加上原始值。
创建一个触发器,在插入或更新时将空白转换为空值:
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 符合 "no blanks" 规则。