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


101

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

TABLE1があります:id、col_1(null以外)、col_2(null以外)、col_3(null以外)

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

どのようにして、TABLE2からTABLE1にIDを挿入し、 "data1"、 "data2"、 "data3"などのハードコードされた文字列でcol_1-3を埋めることができますか?

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

結果は:

エラー:列「col_1」のnull値はnull以外の制約に違反しています

回答:


202

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

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

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

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

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



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'
       );
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.