如何对Firebird字段值强加不区分大小写的唯一约束?

时间:2016-12-30 03:07:40

标签: sql constraints firebird unique-constraint

我想在表AGENT中添加一个名为email的字段。我希望AGENT.email的值在整个表中是唯一的,我希望这个唯一性不区分大小写。

例如添加" MARY@USA.COM"如果" mary@usa.com"会违反约束条件。已经存在于表中。我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以在表格的lower电子邮件列中添加唯一索引,如下所示:

create unique index email_unq_idx on agent computed by (lower(email));

答案 1 :(得分:2)

要强加不区分大小写的约束,最好的方法是使用不区分大小写的排序规则创建列,例如unicode_ci_ai - 此排序规则也是重音不敏感的,您可能想要也可能不想要,并添加一个唯一的该列的约束(或唯一索引):

create table addressbook
(
    id integer not null,
    emailaddress varchar(150) character set utf8 collate unicode_ci_ai,
    constraint pk_addressbook primary key (id),
    constraint uc_emailaddress unique (emailaddress)
);

或将字段添加到现有表格中:

alter table addressbook
    add emailaddress2 varchar(150) character set utf8 
            constraint uc_emailaddress2 unique collate unicode_ci_ai

替代归类将是unicode_ci(仅区分大小写)或其他built-in case insensitive collations,具体取决于所使用的字符集,或create your own specific collation

此解决方案优于Gurwinder提供的解决方案的优势在于它还允许您不敏感地选择大小写(和重音),而无需在where子句中使用lower