PostgreSQL: inserir de outra tabela

101

Estou tentando inserir dados em uma tabela de outra tabela e as tabelas têm apenas uma coluna em comum. O problema é que o TABLE1 tem colunas que não aceitam valores nulos, então não posso deixá-los vazios e não posso obtê-los do TABLE2.

Eu tenho TABLE1: id, col_1 (não nulo), col_2 (não nulo), col_3 (não nulo)

e TABELA2: id, col_a, col_b, col_c

então, como eu poderia inserir id de TABLE2 para TABLE1 e preencher o col_1-3 com strings codificadas como "data1", "data2", "data3"?

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

vai resultar em:

ERRO: o valor nulo na coluna "col_1" viola a restrição não nula

Seerumi
fonte

Respostas:

202

Basta fornecer valores literais no SELECT:

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

Uma lista de seleção pode conter qualquer expressão de valor :

Mas as expressões na lista de seleção não precisam fazer referência a nenhuma coluna na expressão de tabela da cláusula FROM; podem ser expressões aritméticas constantes, por exemplo.

E uma string literal é certamente uma expressão de valor.

mu é muito curto
fonte
4

Você pode usar coalescer:

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

Resposta muito tardia, mas acho que minha resposta é mais direta para casos de uso específicos em que os usuários desejam simplesmente inserir (copiar) dados da tabela A na tabela 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
fonte
0

Para integridade referencial:

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
fonte