PostgreSQL: inserire da un'altra tabella


101

Sto cercando di inserire dati in una tabella da un'altra tabella e le tabelle hanno solo una colonna in comune. Il problema è che la TABELLA1 ha colonne che non accettano valori nulli, quindi non posso lasciarle vuote e non posso ottenerle dalla TABELLA2.

Ho TABLE1: id, col_1 (non null), col_2 (non null), col_3 (non null)

e TABELLA2: id, col_a, col_b, col_c

quindi come posso inserire l'ID da TABLE2 a TABLE1 e riempire col_1-3 con stringhe hard coded come "data1", "data2", "data3"?

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

si tradurrà in:

ERRORE: il valore nullo nella colonna "col_1" viola il vincolo non nullo

Risposte:


202

Fornisci solo valori letterali in SELECT:

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

Un elenco di selezione può contenere qualsiasi espressione di valore :

Ma le espressioni nell'elenco di selezione non devono fare riferimento ad alcuna colonna nell'espressione di tabella della clausola FROM; possono essere espressioni aritmetiche costanti, per esempio.

E una stringa letterale è certamente un'espressione di valore.


4

Potresti usare la fusione:

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

2

Risposta molto tardiva, ma penso che la mia risposta sia più semplice per casi d'uso specifici in cui gli utenti desiderano semplicemente inserire (copiare) i dati dalla tabella A nella tabella B:

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

0

Per integrità referenziale:

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'
       );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.