2012-01-25 64 views
0

我有這樣一張桌子和一個過程:如何在PostgreSQL中爲rowtype變量使用默認列值?

CREATE TABLE test_table (
id SERIAL PRIMARY KEY, 
info TEXT); 

create or replace function test() returns void as 
$$ 
declare 
    v_row test_table%ROWTYPE; 
begin 
    v_row.info := 'test'; 
    insert into test_table values (v_row.*); 
end; 
$$ language plpgsql; 

select test(); 

ERROR: null value in column "id" violates not-null constraint 

如何使用默認值的v_row.id場?我知道我可以寫

insert into test_table (info) values (v_row.info); 

但我真正的情況下,我有很多這樣的表具有很多列,我真的想避免枚舉在INSERT語句中的所有列。

回答

1

通過編寫insert into test_table values (v_row.*);您實際上強制postgres將NULL值插入到id列中。

您將需要運行這樣的代碼 - 無論是在應用

v_row.id := nextval('mysequence'); 

..或觸發

IF NEW.id IS NULL THEN 
    NEW.id := nextval('mysequence'); 
END IF; 
+0

我希望得到像 v_row.id = default; 或 v_row.id = test_table.id.default; 但他們都沒有工作。 – Cezariusz

0

您可以檢查,如果有PostgreSQL的本專欄的一個序列,然後,如果此列有一個DEFAULT值集。在psql嘗試:

\d+ test_table 

你一定要看到somethink這樣的:

id | integer      | default nextval('test_table_id_seq'::regclass) | 

如果沒有一個default nextval('somethink'),那麼你必須檢查,如果有sequnence此列:

\ds+ 

你必須看到這樣的一些想法:

public | test_table_id_seq | sequence 

如果你不會有一個序列,你有一個創建它:

CREATE SEQUENCE test_table_id_seq; 

如果你沒有一個`默認NEXTVAL(「somethink」),你必須使用ALTER TABLE:

ALTER TABLE test_table ALTER COLUMN id SET DEFAULT nextval('test_table_id_seq'); 

你可以找到一些關於它的信息在這裏:http://www.postgresql.org/docs/8.1/static/datatype.html#DATATYPE-SERIAL

也許你可以把它理解,儘管英語不是我的母語...

+0

SERIAL類型創建序列和默認值,正如您所看到的,所以我確實同時具備了這兩者。在插入命令中使用rowtype。*時,將忽略默認值。 – Cezariusz

+0

你說得對,我很抱歉。然後,在@filiprem的回答中使用解決方案是安全的。 –

相關問題