PostgreSQL: вставить из другой таблицы

102

Я пытаюсь вставить данные в таблицу из другой таблицы, а таблицы имеют только один общий столбец. Проблема в том, что в TABLE1 есть столбцы, которые не принимают нулевые значения, поэтому я не могу оставить их пустыми и не могу получить их из TABLE2.

У меня TABLE1: id, col_1 (не ноль), col_2 (не ноль), col_3 (не ноль)

и ТАБЛИЦА2: id, col_a, col_b, col_c

так как я мог вставить идентификатор из таблицы 2 в таблицу 1 и заполнить столбец_1-3 жестко закодированными строками, такими как «данные1», «данные2», «данные3»?

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

приведет к:

ОШИБКА: нулевое значение в столбце "col_1" нарушает ограничение на ненулевое значение.

Сируми
источник

Ответы:

203

Просто укажите буквальные значения в SELECT:

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

Список выбора может содержать любое выражение значения :

Но выражения в списке выбора не должны ссылаться на какие-либо столбцы в табличном выражении предложения FROM; они могут быть, например, постоянными арифметическими выражениями.

И строковый литерал, безусловно, является выражением значения.

mu слишком короткий
источник
4

Вы можете использовать coalesce:

insert into destination select coalesce(field1,'somedata'),... from source;
Скотт Марлоу
источник
2

Очень поздний ответ, но я думаю, что мой ответ более прост для конкретных случаев использования, когда пользователи хотят просто вставить (скопировать) данные из таблицы A в таблицу B:

INSERT INTO table_b (col1, col2, col3, col4, col5, col6)
SELECT col1, 'str_val', int_val, col4, col5, col6
FROM table_a
Том Худ
источник
0

Для ссылочной целостности:

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
источник