PostgreSQL: masukkan dari tabel lain


101

Saya mencoba memasukkan data ke tabel dari tabel lain dan tabel hanya memiliki satu kolom yang sama. Masalahnya adalah, bahwa TABLE1 memiliki kolom yang tidak akan menerima nilai null jadi saya tidak bisa membiarkannya kosong dan saya tidak bisa mendapatkannya dari TABLE2.

Saya memiliki TABLE1: id, col_1 (bukan null), col_2 (bukan null), col_3 (bukan null)

dan TABLE2: id, col_a, col_b, col_c

jadi bagaimana saya bisa memasukkan id dari TABLE2 ke TABLE1 dan mengisi col_1-3 dengan string kode keras seperti "data1", "data2", "data3"?

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

akan menghasilkan:

EROR: nilai null di kolom "col_1" melanggar batasan bukan null

Jawaban:


202

Cukup berikan nilai literal di SELECT:

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

Daftar pilih dapat berisi ekspresi nilai apa pun :

Tetapi ekspresi dalam daftar pilih tidak harus mereferensikan kolom apa pun dalam ekspresi tabel dari klausa FROM; mereka bisa menjadi ekspresi aritmatika konstan, misalnya.

Dan literal string tentu saja merupakan ekspresi nilai.


4

Anda bisa menggunakan coalesce:

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

2

Jawaban yang sangat terlambat, tetapi saya pikir jawaban saya lebih langsung untuk kasus penggunaan tertentu di mana pengguna hanya ingin memasukkan (menyalin) data dari tabel A ke tabel B:

INSERT INTO table_b (col1, col2, col3, col4, col5, col6)
SELECT col1, 'str_val', int_val, col4, col5, col6
FROM table_a

0

Untuk integritas referensial:

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'
       );
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.