web-dev-qa-db-ja.com

PostgreSQL:別のテーブルから挿入

別のテーブルからテーブルにデータを挿入しようとしていますが、テーブルには共通の列が1つしかありません。問題は、TABLE1にはNULL値を受け入れない列があるため、空のままにできず、TABLE2から取得できないことです。

TABLE1:id、col_1(非ヌル)、col_2(非ヌル)、col_3(非ヌル)

およびTABLE2:id、col_a、col_b、col_c

どうすればidをTABLE2からTABLE1に挿入し、col_1-3に「data1」、「data2」、「data3」などのハードコードされた文字列を入力できますか?

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

結果として:

エラー:列「col_1」のヌル値は非ヌル制約に違反しています

86
Seerumi

SELECTでリテラル値を指定するだけです:

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

選択リストには、 任意の値式 を含めることができます。

ただし、選択リストの式は、FROM句のテーブル式の列を参照する必要はありません。たとえば、定数演算式にすることができます。

そして、文字列リテラルは確かに値式です。

171
mu is too short

合体を使用できます:

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

非常に遅い答えですが、ユーザーがテーブル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
Tom Hood