PostgreSQL中的自定义约束

时间:2014-07-28 12:50:01

标签: postgresql indexing constraints primary-key unique

我有一个包含以下字段和示例记录的表:

sample_date  customer   active
 25/12/2010   12356       N
 01/12/2012   12356       N
 05/11/2013   12356       N
 05/07/2014   12356       Y

我想强制执行2个约束:

  • 每个CUSTOMER只有一个“ACTIVE”设置为“Y”(但允许多个“N”)
  • 每个CUSTOMER只需一个SAMPLE_DATE

因此它拒绝为此客户保存任何其他行,其中ACTIVE值为“Y”,除非旧的第一行设置为“N”。

关于如何实现这一点的任何想法?

非常感谢!

1 个答案:

答案 0 :(得分:2)

  

每个CUSTOMER只有一个“ACTIVE”设置为“Y”(但允许几个“N”)

create unique index ix_only_one_active 
   on the_table (customer) 
   where active = 'Y';

这将允许为具有'Y'以外的活动标志的客户插入任意数量的行。您可能还想在该列上添加检查约束


  

每个CUSTOMER只有一个SAMPLE_DATE

create unique index ix_unique_sample_date_customer 
     on the_table (customer, sample_date);

P.S。:我同意poz的评论:将active列定义为boolean

会更好/更清洁