【问题标题】:Custom made constraint in PostgreSQLPostgreSQL 中的自定义约束
【发布时间】:2014-09-19 15:57:49
【问题描述】:

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

sample_date 客户活跃 25/12/2010 12356 否 2012 年 1 月 12 日 12356 2013 年 5 月 11 日 12356 2014 年 5 月 7 日 12356 是

我想强制执行 2 个约束:

  • 每个客户只能将一个“ACTIVE”设置为“Y”(但允许多个“N”)
  • 每位客户只需一个 SAMPLE_DATE

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

你知道如何实现吗?

非常感谢!

【问题讨论】:

标签: postgresql indexing constraints primary-key unique


【解决方案1】:

每个客户只能将一个“ACTIVE”设置为“Y”(但允许多个“N”)

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

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


每位客户只需一个 SAMPLE_DATE

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

P.S.:我同意 pozs 的评论:将 active 列定义为 boolean 会更好/更干净

【讨论】:

  • 完美!谢谢!我将该字段用作布尔值,我只是没有在示例中显示以保持简单。但是这两种不同的约束条件非常适合我想要做的事情!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
相关资源
最近更新 更多