代码之家  ›  专栏  ›  技术社区  ›  Jarrett Meyer

SQL Server 2008中唯一的非必需列

  •  1
  • Jarrett Meyer  · 技术社区  · 14 年前

    使用SQL Server 2008,我有一个要求,即用户表中的电子邮件地址必须是唯一的,但我的应用程序中不需要电子邮件地址。 我已经试过要求提供电子邮件地址,但我不能让客户对此有所让步。 创建这个约束的最佳方法是什么?如果我添加一个约束,约束看起来是什么样的?如果我在插入触发器之前添加一个,它是什么样子的?

    此应用程序将在多服务器Web场上运行,并且有多个入口点。应用程序级别 lock() { } 不是一个很好的选择。在执行插入操作之前,我正在从代码中选择并验证电子邮件是否不存在,以便立即向用户提供反馈。不过,我真的希望这里有一个数据库级的解决方案。以防万一。

    我使用的是ORM(nhibernate和automapping),所以我不希望用存储过程插入或更新记录。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Remus Rusanu    14 年前

    使用唯一的筛选索引:

    create table Foo (
     Id int not null identity(1,1) primary key
     , Name varchar(256) null
     , Address varchar(max) null
     , Email varchar(256) null);
    
    create index ndxFooEmail unique on Foo(Email) 
     where Email is not null;
    

    这是一个确保射击100%防弹的方法,以确保可选值的唯一性。唯一性将在数据库服务器中强制执行,您的ORM/DAL不需要担心它,只需在违反唯一约束的情况下处理错误,而不是尝试在ORM/DAL中复制约束(在并发情况下不可能正确执行)。

    Filtered Index Design Guidelines 有关SQL Server 2008筛选索引的详细信息。