169 votes

PostgreSQL : insertion à partir d'une autre table

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 la TABLE1 a des colonnes qui n'acceptent pas les valeurs nulles, de sorte que je ne peux pas les laisser vides et que je ne peux pas les obtenir de la TABLE2.

J'ai le TABLEAU1 : id, col_1 (non null), col_2(non null), col_3 (non null)

et TABLEAU2 : id, col_a, col_b, col_c

Comment puis-je insérer l'id de TABLE2 à TABLE1 et remplir les 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";

se traduira par :

ERREUR : la valeur nulle dans la colonne "col_1" viole la contrainte "not-null".

321voto

mu is too short Points 205090

Vous pouvez fournir des valeurs littérales dans le 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 toute expression de valeur :

Mais les expressions de la liste de sélection ne doivent pas nécessairement faire référence à des colonnes de 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.

15voto

kris2k Points 75

Pour l'intégrité 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'
       );

8voto

Tom Hood Points 347

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

INSERT INTO table_b (col1, col2, col3, col4, col5, col6)
SELECT col1, 'str_val', int_val, col4, col5, col6
FROM table_a

6voto

Scott Marlowe Points 2231

Vous pouvez utiliser coalesce :

insert into destination select coalesce(field1,'somedata'),... from source;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X