2012-03-01 36 views
4

我有一張表,將其稱爲t1,帶有三個整數列c1,c2,c3。 C1有一個默認值:在INSERT語句中將一列的默認值設置爲另一列

not null default nextval 

對於INSERT語句我目前做的,我想C2具有相同的價值將被分配到C1。我的大多數插入都不是這種情況,所以將c2定義爲具有默認值或在更新時具有觸發器是沒有意義的。目前,我做兩個語句:

INSERT INTO t1 (c3) VALUES (val3); 
UPDATE t1 SET c2 = c1 WHERE //Get correct row 

回答

7

不能保證,其中一組的順序的元件將被處理。也有不需要進行兩個函數調用。使用子選擇或CTE

INSERT INTO t (c1, c2, c3) 
SELECT x.s, x.s, val3 
FROM (SELECT nextval('c1_seq') AS s) x; 

或者用CTE:

WITH x(s) AS (SELECT nextval('c1_seq')) 
INSERT INTO t (c1, c2, c3) 
SELECT x.s, x.s, val3 
FROM x; 
+1

這種類型的CTE在版本9.1中是新的,它不適用於舊版本。 – 2012-03-02 07:07:22

1

c1的默認值僅如果你不爲它提供一個明確的值或者,當然使用,如果你明確要求與default的默認值你的價值。您也可以在VALUES中使用nextval and currval自由訪問序列; nextval功能是這樣做的:

高級順序並返回新值。

currval

返回最近一次用nextval獲得指定序列

所以,你可以這樣做是爲了獲得一個序列值的c1並獲得相同的值c2

insert into t1 (c1, c2, c3) values (nextval('c1_seq'), currval('c1_seq'), val3) 

其中c1_seq是您用於爲c1提供默認值的序列的名稱。

2

在你的情況,你需要爲C2設置的默認值序列的當前值,與C1相關,即:

ALTER TABLE 
    t1 
ALTER COLUMN 
    c2 
SET DEFAULT 
    CURRVAL(PG_GET_SERIAL_SEQUENCE('t1', 'c1')); 

當然,這是行不通的如果您爲c1指定了一些明確的值。如果有這種情況,那麼您應該做一個BEFORE觸發器,以確保c2總是與插入時的c1相同。

CREATE FUNCTION sync_c2() RETURNS trigger AS $$ 
BEGIN 
    IF NEW.c2 IS NULL THEN 
    NEW.c2 := NEW.c1; 
    END IF; 

    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 


CREATE TRIGGER 
    sync_c2 
BEFORE INSERT ON 
    t1 
FOR EACH ROW EXECUTE PROCEDURE 
    sync_c2(); 
+0

觸發器中的IF支票給你的自由,從C1,C2,不同的顯式指定的值,如果你想至。 – 2012-03-01 22:30:35

相關問題