2013-02-21 45 views
4

我想使用序列爲我的數據庫中的某些對象創建友好的ID。我的問題是,我不希望該序列是表的全局,而是我想增加基於外鍵的值。在PostgreSQL中增加一個基於外鍵的序列

例如,我的表被定義爲:

CREATE TABLE foo (id numeric PRIMARY KEY, friendly_id SERIAL, bar_id numeric NOT NULL) 

而且我想friendly_id爲每個bar_id使得下面的語句分別增加:

INSERT INTO foo (123, DEFAULT, 345) 
INSERT INTO foo (124, DEFAULT, 345) 
INSERT INTO foo (125, DEFAULT, 346) 
INSERT INTO foo (126, DEFAULT, 345) 

會導致(期望的行爲):

id   | friendly_id  | bar_id 
-----------+------------------+----------------- 
123  | 1    | 345 
124  | 2    | 345 
125  | 1    | 346 
126  | 3    | 345 

而不是(cur租金行爲):

id   | friendly_id  | bar_id 
-----------+------------------+----------------- 
123  | 1    | 345 
124  | 2    | 345 
125  | 3    | 346 
126  | 4    | 345 

這是可能的使用序列或有沒有更好的方法來實現呢?

+1

你可以嘗試使用可更新'VIEW'此表有'ROW_NUMBER ()OVER(PARTITION BY bar_id ORDER BY id)as friendly_id' – 2013-02-21 21:42:12

回答

5
create table foo (
    id serial primary key, 
    friendly_id integer not null, 
    bar_id integer not null, 
    unique(friendly_id, bar_id) 
); 

在應用程序包插入在異常捕獲循環重試,如果重複鍵異常引發

insert into foo (friendly_id, bar_id) 
select 
    coalesce(max(friendly_id), 0) + 1, 
    346 
from foo 
where bar_id = 346 
+0

謝謝!我希望我只是錯過了一種內置的方式來完成這個使用序列,但這也是一樣的。 – Bill 2013-02-22 18:22:13

相關問題