Wie füge ich Werte in eine Tabelle mit Standardwerten aus einer Auswahlabfrage in PostgreSQL ein?

7

Ist es möglich, INSERTWerte aus einer SELECTAnweisung in eine PostgreSQL-Tabelle zu schreiben und DEFAULTWerte für die Spalten zu verwenden, die null sind?

In meinem Fall wird die SELECTAnweisung aus JSON ausgewählt.

In den folgenden Versuchen war es mir gelungen, die Sequenz explizit abzurufen, aber ich hoffe, dass es eine Möglichkeit gibt, entweder INSERT mit den DEFAULT-Werten einzufügen. Oder wählen Sie DEFAULT-Werte aus, ohne die Standardfunktionen explizit aufrufen zu müssen.

-- 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'
Jay Cummins
quelle

Antworten:

4

Wenn Sie alle ColumnsNames (mit Ausnahme der 'id'-Spalte) nach dem Tablename hinzufügen, wird die Seriennummer automatisch wie folgt eingefügt:

INSERT INTO animals(nm,typ,tvi,tvf) select nm,typ,tvi,tvf from json_po..... 

Sie können Ihrer Spalte auch einen STANDARD-Wert hinzufügen , um einen Standardwert festzulegen , wenn sich die Spalte nicht in der Liste Spalte einfügen befindet.

Patrick7
quelle
1

Wenn Sie mehr als einen Datensatz hinzufügen möchten:

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}
]
');
Magic Oz
quelle