PostgreSQL: Einfügen aus einer anderen Tabelle

101

Ich versuche, Daten aus einer anderen Tabelle in eine Tabelle einzufügen, und die Tabellen haben nur eine Spalte gemeinsam. Das Problem ist, dass TABLE1 Spalten enthält, die keine Nullwerte akzeptieren, sodass ich sie nicht leer lassen und nicht aus TABLE2 abrufen kann.

Ich habe TABELLE1: id, col_1 (nicht null), col_2 (nicht null), col_3 (nicht null)

und TABELLE 2: id, col_a, col_b, col_c

Wie könnte ich also eine ID von TABLE2 in TABLE1 einfügen und col_1-3 mit fest codierten Zeichenfolgen wie "data1", "data2", "data3" füllen?

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

wird darin enden, dass:

FEHLER: Der Nullwert in der Spalte "col_1" verletzt die Nicht-Null-Einschränkung

Seerumi
quelle

Antworten:

201

Geben Sie einfach Literalwerte in SELECT ein:

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

Eine Auswahlliste kann einen beliebigen Werteausdruck enthalten :

Die Ausdrücke in der Auswahlliste müssen jedoch keine Spalten im Tabellenausdruck der FROM-Klausel referenzieren. Sie können beispielsweise konstante arithmetische Ausdrücke sein.

Und ein String-Literal ist sicherlich ein Werteausdruck.

mu ist zu kurz
quelle
4

Sie könnten Koaleszenz verwenden:

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

Sehr späte Antwort, aber ich denke, meine Antwort ist einfacher für bestimmte Anwendungsfälle, in denen Benutzer einfach Daten aus Tabelle A in Tabelle B einfügen (kopieren) möchten:

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

Für referenzielle Integrität:

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
quelle