如何將列B的默認值設置爲列A中的值?如何將列B的默認值設置爲posgresql中列A的值?
我知道,有可能在的Microsoft SQL Server:
http://www.ideaexcursion.com/2010/04/19/default-column-value-to-identity-of-different-column/
是否有可能在posgresql?
如何將列B的默認值設置爲列A中的值?如何將列B的默認值設置爲posgresql中列A的值?
我知道,有可能在的Microsoft SQL Server:
http://www.ideaexcursion.com/2010/04/19/default-column-value-to-identity-of-different-column/
是否有可能在posgresql?
鏈接的示例顯示如何使用同一個表的標識列的值初始化一列。
這是可能的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中的值?「是不幸的:沒有,你不能(見克林的評論)
‘你不能這樣做,說:’和Postgres不順利起來有幾乎總是一個辦法,你可以做到這一點(不管。」 「原來是)
的問題更像是:?你想怎麼辦呢
的一種方式,那就是不錯的DB-管理員將是:創建一個前觸發器,操縱新的行被寫入之前
如果您的規則創建新列非常花哨:轉到開啓e嵌入式語言(如perl)。
所以:有可能嗎?當然如此。
你不能用一個實際的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();
你不能做到這一點,請參閱:(http://stackoverflow.com/questions/32183363/default-value-for-column-postgres-function-with- [與參數列Postgres的功能默認值]參數/ 32184436#32184436)。 – klin
嗯,我會把它留作空,並使用Coalesce(col_b,col_a)來選擇它 –
出於興趣...你爲什麼要這麼做?你想達到什麼目的? –