【问题标题】:Set a unique constraint across multiple table columns跨多个表列设置唯一约束
【发布时间】:2019-09-12 22:56:39
【问题描述】:

我正在 SQL Server 中创建一个包含以下列的表:

ic_card_num, 
employee_id, 
active

如果只有一张卡处于活动状态,则 ic_card_num 和 active 的多个副本是可以的:

employee_id | ic_card_num |  active       
   123      |    111      |   false      
   235      |    111      |   true      
   987      |    111      |   false      

我想避免这种情况:

employee_id | ic_card_num |  active       
   123      |    111      |   true      
   235      |    111      |   true      
   987      |    111      |   false      

我正在使用 SQL Server,有没有办法确保我的表中不允许有多个活动的 id_card_num 记录?

【问题讨论】:

  • 您可能需要一个触发器来检查条件并在损坏时回滚。
  • 看起来更像是客户端逻辑?

标签: sql-server database-design unique-constraint


【解决方案1】:

使用唯一的过滤索引:

create table ct
(
  ic_card_num int,
  employee_id int,
  active bit
)

create unique index ak_OnlyOneActive_ic_card 
on ct(ic_card_num) 
where active = 1

insert into ct(employee_id, ic_card_num, active)
values (123,111,1),(978,111,0)
go

insert into ct(employee_id, ic_card_num, active)
values (235,111,1)
--Cannot insert duplicate key row in object 'dbo.ct' with unique index 'ak_OnlyOneActive_ic_card'. The duplicate key value is (111).

【讨论】:

  • 过滤索引的巧妙运用!
  • 正是我想要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 2012-05-07
  • 1970-01-01
  • 2013-08-23
  • 2018-09-14
  • 2013-04-30
  • 1970-01-01
  • 2018-06-29
相关资源
最近更新 更多