2009-11-05 25 views
0

比方說,我們有這個定義的表:如何在PosgreSQL數據庫中聲明範圍重疊約束?

range (
    id bigint primary key, 
    colourId int references colour(id), 
    smellId int references smell(id), 
    from bigint, 
    to bigint 
) 

該表實際上是在巨大的大桌子減少的觀點:

item (
    id bigint primary key, 
    colourId int references colour(id), 
    smellId int references smell(id), 
    CONSTRAINT item_colour_smell_unique UNIQUE (colour, smell, id) 
) 

我想在range表翻譯item_colour_smell_unique約束。它應該觀察範圍[from, to]的重疊,同時採取colourIdsmellId列值。

回答

1

請注意,任何基於觸發器的解決方案在競爭條件下本質上都是不安全的,例如,當兩個併發事務插入具有衝突範圍的行時,由於「隔離」ACID屬性(只能看到提交的數據),它們都不會看到其他有衝突的行。

一些解決方案:

  • 與表強制插入的系列化明確鎖定使用手續。
  • 將[from,to]範圍拆分爲[from,from + 1,...,to-1,to]並插入一行。這樣,您可以在「範圍」表上使用簡單的唯一索引。在PostgreSQL的8.5

PostgreSQL的開發者傑夫·戴維斯has been writingabout this lately並將實施範圍衝突的限制

0

這並不完全給你一個答案,但它聽起來像你可能想要使用觸發器。

1

沒有標準的「重疊」約束。你將不得不從一些觸發器構建你自己的。儘管8.5已經討論過這個問題。

您可能會發現「seg」模塊也很有用。請參閱手冊 - 附錄F.附加提供的模塊