web-dev-qa-db-fra.com

PostgreSQL: insère depuis 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 NULL. Je ne peux donc pas les laisser vides et je ne peux pas les obtenir à partir de la 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 id de TABLE2 à TABLE1 et remplir la colonne_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 null dans la colonne "col_1" viole la contrainte non nulle

86
Seerumi

Fournissez simplement 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 :

Toutefois, les expressions de la liste de sélection ne doivent référencer aucune colonne dans l'expression de table de la clause FROM; ils peuvent être des expressions arithmétiques constantes, par exemple.

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

171
mu is too short

Vous pouvez utiliser coalesce:

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

Réponse très tardive, mais je pense que ma réponse est plus simple pour des cas d'utilisation spécifiques où les utilisateurs veulent simplement insérer (copier) des 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
0
Tom Hood