web-dev-qa-db-fra.com

Comment insérer des valeurs dans une table avec les valeurs par défaut d'une requête de sélection dans PostgreSQL?

Est-il possible de INSERT valeurs dans une table PostgreSQL à partir d'une instruction SELECT et d'utiliser DEFAULT valeurs pour les colonnes qui sont nulles?

Dans mon cas, l'instruction SELECT sélectionne dans JSON.

Dans les tentatives ci-dessous, j'ai réussi à récupérer explicitement la séquence, mais j'espère qu'il existe un moyen d'insérer soit en utilisant les valeurs par défaut. Ou sélectionnez les valeurs PAR DÉFAUT sans avoir à appeler explicitement les fonctions par défaut.

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

Si vous ajoutez tous les ColumnsNames (excluez la colonne 'id') après le nom de la table, il y aura Insérer automatiquement la série comme:

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

Vous pouvez également ajouter un valeur par défaut dans votre colonne, pour définir une valeur par défaut si la colonne n'est pas dans la liste Insérer une colonne.

4
Patrick7

Si vous souhaitez ajouter plusieurs enregistrements:

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