2015-04-01 23 views
0

并且提前感谢任何能够提供帮助的人。我有下面这张表。Postgres,在2列之间创建值的唯一性

表发票


ID | delivery_statement_id | supply_statement_id

_ | 1 | 2

_ | 3 | 4

_ | 2 | 4 < - 不应该传递给DB,因为ID 2已经在第一行中使用。

我想确保唯一的ID两列之间存在整个数据库

如果statement_id 1已经使用它永远无法交付,或供应声明再次使用。 请帮忙,当我搜索这个问题时,我一直在索引多列,但只解决行组合的问题。

谢谢

+0

您是否生成了id标记,或将它们作为来自其他来源的输入? – 2015-04-01 17:22:57

+0

如果您指的是交付和声明的ID,我正在从数据库中获取值。 – 2015-04-06 13:04:06

回答

0

我的理解是,你有以下结构的表:

"invoice" 
(
id (primary key), 
delivery_statement_id, 
supply_statement_id 
) 

从柱的侧向承载力的名称来看,“delivery_statement_id”和“supply_statement_id”是外键同样,外部表...让我们说,他们指的“说法”

"invoice" 
(
id (primary key), 
delivery_statement_id -> statement(id), 
supply_statement_id -> statement(id) 
) 

如果你有一个表“的声明”,并要避免多个参照的文从“delivery_statement_id”和“supply_statement_id”国际消费电子展 - 我的建议是“INVOICE_ID”一栏增加了“声明”表:无参考

"statement" 
(
id (primary key), 
/** some other columns **/ 
invoice_id (nullable, with unique constraint) -> invoice(id) 
) 

所以首先您必须在“声明”行到任何发票 那么您设置了delivery_statement_id和supply_statement_id ,并且在设置每个值之后,您必须将其“注册”到“语句”表中......这可以很容易地实现为触发器,附加到“发票”表

+0

嗨Voycheck,你明确的理解了这个问题,但是我发现在语句表中生成invoice_id时发生错误。两条声明总是指向一张发票,所以唯一约束将失败。我认为更好的解决方法是将statement_id留在发票表中,并且每个都在语句表中区分为交付或供应。这可以通过创建属性类型或类似布尔delivery_statement(如果比它的供应声明为假)来实现。 – 2015-04-06 13:00:30

相关问题