PostgreSQL: insérer depuis une autre table

101

J'essaie d'insérer des données dans une table à partir d'une autre table et les tables n'ont qu'une seule colonne en commun. Le problème est que le TABLE1 a des colonnes qui n'acceptent pas les valeurs nulles, donc je ne peux pas les laisser vides et je ne peux pas les obtenir à partir de TABLE2.

J'ai TABLE1: id, col_1 (non nul), col_2 (non nul), col_3 (non nul)

et TABLE2: id, col_a, col_b, col_c

alors comment pourrais-je insérer l'identifiant de TABLE2 à TABLE1 et remplir le col_1-3 avec des chaînes codées en dur comme "data1", "data2", "data3"?

INSERT INTO TABLE1 (id) SELECT id FROM TABLE2 WHERE col_a = "something";

aura pour résultat:

ERREUR: la valeur nulle dans la colonne "col_1" enfreint la contrainte non nulle

Seerumi
la source

Réponses:

202

Fournissez simplement des valeurs littérales dans SELECT:

INSERT INTO TABLE1 (id, col_1, col_2, col_3)
SELECT id, 'data1', 'data2', 'data3'
FROM TABLE2
WHERE col_a = 'something';

Une liste de sélection peut contenir n'importe quelle expression de valeur :

Mais les expressions de la liste de sélection n'ont pas à référencer de colonnes dans l'expression de table de la clause FROM; il peut s'agir d'expressions arithmétiques constantes, par exemple.

Et une chaîne littérale est certainement une expression de valeur.

mu est trop court
la source
4

Vous pouvez utiliser coalesce:

insert into destination select coalesce(field1,'somedata'),... from source;
Scott Marlowe
la source
2

Réponse très tardive, mais je pense que ma réponse est plus simple pour les cas d'utilisation spécifiques où les utilisateurs veulent simplement insérer (copier) les données du tableau A dans le tableau B:

INSERT INTO table_b (col1, col2, col3, col4, col5, col6)
SELECT col1, 'str_val', int_val, col4, col5, col6
FROM table_a
Tom Hood
la source
0

Pour l'intégralité référentielle:

insert into  main_tbl (col1, ref1, ref2, createdby)
values ('col1_val',
        (select ref1 from ref1_tbl where lookup_val = 'lookup1'),
        (select ref2 from ref2_tbl where lookup_val = 'lookup2'),
        'init-load'
       );
kris2k
la source