Postgresql
如何從 PostgreSQL 中的選擇查詢中將值插入到具有預設值的表中?
是否可以從語句中將
INSERT
值放入 PostgreSQL 表並為空列使用值?SELECT``DEFAULT
就我而言,該
SELECT
語句是從 JSON 中選擇的。在下面的嘗試中,我通過顯式檢索序列而成功,但我希望有一種方法可以使用 DEFAULT 值插入。或者選擇預設值而無需顯式呼叫預設函式。
-- Example table create table animals ( id serial, nm character varying (30) NOT NULL, --name typ character varying(10), tvi integer, tvf numeric(8,3) ); insert into animals VALUES (DEFAULT,'mouse','m',4,12.45); select row_to_json(a) from animals a; select * from json_populate_record(null::animals,'{"id":null,"nm":"mouse","typ":"m","tvi":4,"tvf":12.450}'); --All good. -- Attempt #1 INSERT INTO animals select id ,nm,typ,tvi,tvf from json_populate_record(null::animals,'{"id":null,"nm":"mouse","typ":"m","tvi":4,"tvf":12.450}'); /* ERROR: null value in column "id" violates not-null constraint DETAIL: Failing row contains (null, mouse, m, 4, 12.450). ********** Error ********** ERROR: null value in column "id" violates not-null constraint SQL state: 23502 Detail: Failing row contains (null, mouse, m, 4, 12.450). */ -- Attempt #2 INSERT INTO animals select DEFAULT,nm,typ,tvi,tvf from json_populate_record(null::animals,'{"id":null,"nm":"mouse","typ":"m","tvi":4,"tvf":12.450}'); /* I didn't expect this to work, but it does illustrate what I am trying to accomplish ERROR: syntax error at or near "DEFAULT" LINE 2: select DEFAULT,nm,typ,tvi,tvf from json_populate_record(null... ^ ********** Error ********** ERROR: syntax error at or near "DEFAULT" SQL state: 42601 Character: 28 */ -- Attempt #3 INSERT INTO animals select nextval('animals_id_seq'::regclass),nm,typ,tvi,tvf from json_populate_record(null::animals,'{"id":null,"nm":"mouse","typ":"m","tvi":4,"tvf":12.450}'); /* This works, but I'm hoping for a way to accomplish this without knowing the underlying functions generating the default values. Query returned successfully: one row affected, 11 msec execution time. */ select version(); --'PostgreSQL 9.5.1, compiled by Visual C++ build 1800, 64-bit'
如果在 Tablename 之後添加所有 ColumnsNames(不包括 ‘id’ 列),則會自動插入序列號,如:
INSERT INTO animals(nm,typ,tvi,tvf) select nm,typ,tvi,tvf from json_po.....
如果列不在插入列列表中,您還可以在列中添加預設值以設置預設值。
如果要添加多條記錄:
insert into animals(nm,typ,tvi,tvf) select nm,typ,tvi,tvf from json_populate_recordset(null::animals, ' [ {"nm":"mouse","typ":"m","tvi":4,"tvf":12.450}, {"nm":"dog","typ":"x","tvi":10,"tvf":13.450} ] ');