PostgreSQL: wstaw z innej tabeli

101

Próbuję wstawić dane do tabeli z innej tabeli, a tabele mają tylko jedną wspólną kolumnę. Problem polega na tym, że TABLE1 ma kolumny, które nie przyjmują wartości null, więc nie mogę ich zostawić pustych i nie mogę ich pobrać z TABLE2.

Mam TABLE1: id, col_1 (not null), col_2 (not null), col_3 (not null)

i TABELA2: id, col_a, col_b, col_c

więc jak mogę wstawić id z TABLE2 do TABLE1 i wypełnić col_1-3 ciągami zakodowanymi na stałe, takimi jak „data1”, „data2”, „data3”?

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

spowoduje:

BŁĄD: wartość pusta w kolumnie „col_1” narusza ograniczenie niezerowe

Seerumi
źródło

Odpowiedzi:

202

Po prostu podaj dosłowne wartości w SELECT:

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

Lista wyboru może zawierać dowolne wyrażenie wartości :

Ale wyrażenia na liście wyboru nie muszą odwoływać się do żadnych kolumn w wyrażeniu tabelowym klauzuli FROM; mogą to być na przykład stałe wyrażenia arytmetyczne.

A literał łańcuchowy jest z pewnością wyrażeniem wartości.

mu jest za krótkie
źródło
4

Możesz użyć coalesce:

insert into destination select coalesce(field1,'somedata'),... from source;
Scott Marlowe
źródło
2

Bardzo późna odpowiedź, ale myślę, że moja odpowiedź jest prostsza w przypadku konkretnych przypadków użycia, w których użytkownicy chcą po prostu wstawić (skopiować) dane z tabeli A do tabeli 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
źródło
0

Dla referencyjnej integralności:

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
źródło