我有一个Accounts
表,并且在同时两次调用WS的同时创建重复的帐户时遇到了问题。
我想做的是向表Account
添加唯一键,其中Identification_Type
,Identification_Number
和Account_Status
不应重复。
但是问题是,只有具有Identification_Type
,Identification_Number
或Account_Status = Closed
的帐户才能拥有多个Rejected
和Expired
。没关系。
如果状态为Created
,Pending
,Enabled
,Inabilited
,我将没有多个帐户。
如果已有一个带有Status = Created
,Pending
,Enabled
,Inabilited
的帐户,我想阻止创建一个帐户。
是否有一种方法可以在此限制下在SQL中创建唯一键或其他内容?
我将举一个我想防止的例子。
表帐户:
Identification_Type |身份证号码| Account_Status
--------- 1 ----------------------- 12345678 ------------- ----关闭
--------- 1 ----------------------- 12345678 ---------------- -关闭
--------- 1 ----------------------- 12345678 ---------------- -被拒绝
--------- 1 ----------------------- 12345678 ---------------- -关闭
--------- 1 ----------------------- 12345678 ---------------- -已过期
--------- 1 ----------------------- 12345678 - --------------- 已创建
而且,由于Account
中已经有一个Account_Status = Created
,因此我想添加一个唯一键,以防止在Account_Status = Created
,Pending
,{{1 }}或Enabled
。
对于Inabilited
的相同组合,在Account
,Account_Status = Created
,Pending
或Enabled
中,我不能有多个Inabilited
| Identification_Type
,但其他状态我可以有几个。
预先感谢
答案 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
,则可能不希望这样做。