2015-10-02 63 views
1

如何將列B的默認值設置爲列A中的值?如何將列B的默認值設置爲posgresql中列A的值?

我知道,有可能在的Microsoft SQL Server

http://www.ideaexcursion.com/2010/04/19/default-column-value-to-identity-of-different-column/

是否有可能在posgresql

+0

你不能做到這一點,請參閱:(http://stackoverflow.com/questions/32183363/default-value-for-column-postgres-function-with- [與參數列Postgres的功能默認值]參數/ 32184436#32184436)。 – klin

+1

嗯,我會把它留作空,並使用Coalesce(col_b,col_a)來選擇它 –

+0

出於興趣...你爲什麼要這麼做?你想達到什麼目的? –

回答

1

鏈接的示例顯示如何使用同一個表的標識列的值初始化一列。

這是可能的Postgres裏

create table identdefault 
(
    a serial not null, 
    b int not null default currval('identdefault_a_seq') 
); 

serial將創建一個名爲tablename_column_seq背景序列因此,我們知道,對於identdefault.a序列將被命名爲identdefault_a_seq,我們可以通過currval訪問的最後一個值功能。

運行:

insert into identdefault default values; 
insert into identdefault default values; 
insert into identdefault default values; 

select * 
from identdefault 

將輸出:

a | b 
--+-- 
1 | 1 
2 | 2 
3 | 3 

這似乎只有在Postgres 9.4,當我試圖與9.3(上SQLFiddle)我得到一個錯誤的工作。但在這種情況下,它是可能的 - 你就不能使用「快捷方式」 serial但需要明確創建序列:如果你想有一個相同的定義與serial

create sequence identdefault_a_seq; 

create table identdefault 
(
    a int not null default nextval('identdefault_a_seq'), 
    b int not null default currval('identdefault_a_seq') 
); 


insert into identdefault default values; 
insert into identdefault default values; 
insert into identdefault default values; 

,你只需要進行序列屬於列:

alter sequence identdefault_a_seq owned by identdefault.a; 

SQLFiddle:http://sqlfiddle.com/#!15/0aa34/1


答案到更廣泛的問題「如何將列B的默認值設置爲列A中的值?「是不幸的:沒有,你不能(見克林的評論)

1

‘你不能這樣做,說:’和Postgres不順利起來有幾乎總是一個辦法,你可以做到這一點(不管。」 「原來是)

的問題更像是:?你想怎麼辦呢

的一種方式,那就是不錯的DB-管理員將是:創建一個前觸發器,操縱新的行被寫入之前

如果您的規則創建新列非常花哨:轉到開啓e嵌入式語言(如perl)。

所以:有可能嗎?當然如此。

2

你不能用一個實際的DEFAULT做到這一點,但它觸發一個BEFORE微不足道。

CREATE OR REPLACE FUNCTION whatever() RETURNS trigger LANGUAGE plpgsql AS $$ 
BEGIN 
    NEW.onecol := NEW.othercol; 
    RETURN NEW; 
END; 
$$; 

CREATE TRIGGER whatever_tg 
BEFORE INSERT ON mytable 
FOR EACH ROW EXECUTE PROCEDURE whatever(); 
相關問題