使列具有唯一性,但有一个例外

时间:2016-10-13 17:21:19

标签: sql sql-server tsql

我们有一个应用程序,其工作流程涉及向外部组提交信息,然后将用户的ID号输入系统。

出于这个原因,我们允许将一个设置的默认值"00000000"作为暂定值放入id字段中,然后才能批准该条目并输入一个永久值。

我正在寻找的内容实际上是一种确保列保持unique 除了那个值的方法。

我基本上寻找的是UNIQUE约束,但NULL不是"00000000",而是CHECK。我认为这是class register_model extends CI_Controller { 约束的一部分,但这似乎是一个很大的性能影响。 (假设UNIQUE进行某种索引)

2 个答案:

答案 0 :(得分:8)

使用已过滤的索引

如下: -

CREATE UNIQUE NONCLUSTERED INDEX idx_yourcolumn_notspecificvalue
ON YourTable(yourcolumn)
WHERE yourcolumn != "00000000";

示例:

-- Create Table
Create table Test (id int identity, code varchar (100))

-- Create Unique Filtered  Index
CREATE UNIQUE NONCLUSTERED INDEX idx_MyCol_Filtered 
ON Test(code)
WHERE code != '00000000';

-- Insert Dumy Data >> '00000000' is repeated and '0101' is once
insert into Test (code) 
Values  ('00000000'),
        ('00000000'),
        ('00000000'),
        ('0101')


select * from Test

结果:

enter image description here

-- Now try inserting '0101' again
insert into Test (code) Values ('0101')

结果:

enter image description here

了解更多详情: Create Filtered Indexes

答案 1 :(得分:0)

通过工作流批准用户输入听起来像非常关键的业务逻辑。我想建议生成随机但唯一(如时间戳)的数字,并插入新的用户条目。保留额外的列,以区分(标记)已批准的条目与未批准的条目。一旦用户获得工作流程的批准,请更新id和flag。