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'
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.
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}
]
');