SQL Server:创建唯一键但列之一可能具有多个值

时间:2018-07-20 16:17:21

标签: sql sql-server

我有一个Accounts表,并且在同时两次调用WS的同时创建重复的帐户时遇到了问题。

我想做的是向表Account添加唯一键,其中Identification_TypeIdentification_NumberAccount_Status不应重复。

但是问题是,只有具有Identification_TypeIdentification_NumberAccount_Status = Closed的帐户才能拥有多个RejectedExpired。没关系。

如果状态为CreatedPendingEnabledInabilited,我将没有多个帐户。

如果已有一个带有Status = CreatedPendingEnabledInabilited的帐户,我想阻止创建一个帐户。

是否有一种方法可以在此限制下在SQL中创建唯一键或其他内容?

我将举一个我想防止的例子。

表帐户:

Identification_Type |身份证号码| Account_Status

--------- 1 ----------------------- 12345678 ------------- ----关闭
--------- 1 ----------------------- 12345678 ---------------- -关闭
--------- 1 ----------------------- 12345678 ---------------- -被拒绝
--------- 1 ----------------------- 12345678 ---------------- -关闭
--------- 1 ----------------------- 12345678 ---------------- -已过期
--------- 1 ----------------------- 12345678 - --------------- 已创建

而且,由于Account中已经有一个Account_Status = Created,因此我想添加一个唯一键,以防止在Account_Status = CreatedPending,{{1 }}或Enabled

对于Inabilited的相同组合,在AccountAccount_Status = CreatedPendingEnabled中,我不能有多个Inabilited | Identification_Type,但其他状态我可以有几个。

预先感谢

1 个答案:

答案 0 :(得分:3)

我不确定您要保持唯一性,但问题的答案是经过过滤的唯一索引

类似这样的东西:

create unique index unq_accounts_filtered
    on accounts(Identification_Type, Identification_Number)
    where account_status in ('Created', 'Pending', 'Enabled', 'Inabilited');

这将仅阻止具有这些状态的帐户。您可能还需要:

create unique index unq_accounts_3
    on accounts(Identification_Type, Identification_Number, account_status);

防止重复的状态相同。另一方面,例如,如果倍数可以为closed,则可能不希望这样做。