2017-05-31 3 views
0

Also ich bin ziemlich neu in Postgresql und begann damit zu arbeiten, indem Sie einige Sachen mit pgadmin4 auf Postgres9.6 testen.Importieren CSV in Postgres: Update & Einfügen zur gleichen Zeit

Das Problem:

Ich habe eine Tabelle: Test (id, Text)

In dieser Tabelle Ich habe 10 Datenzeilen. Jetzt möchte ich eine CSV importieren, die 12 Zeilen hat, um die Testtabelle zu aktualisieren. Einige Textänderungen für die ersten 10 Zeilen UND ich möchte die 2 zusätzlichen Zeilen aus der CSV einfügen.

Ich weiß, dass Sie alle Daten aus einer Tabelle abschneiden und alles wieder aus der CSV importieren können, aber das ist keine gute Möglichkeit, dies zu tun. Ich möchte meine vorhandenen Daten aktualisieren & Fügen Sie die neuen Daten mit einer Abfrage ein.

Ich habe bereits eine Funktion gefunden, die dies mit einer temporären Tabelle lösen sollte. Dies aktualisiert die vorhandenen Zeilen richtig, aber die zwei zusätzlichen Zeilen werden nicht eingefügt

CREATE OR REPLACE FUNCTION upsert_test(integer,varchar) RETURNS VOID AS $$ 
DECLARE 
BEGIN 
    UPDATE test 
SET id = tmp_table.id, 
text = tmp_table.text 
FROM tmp_table 
WHERE test.id = tmp_table.id; 
IF NOT FOUND THEN 
INSERT INTO test(id,text) values 
(tmp_table.id,tmp_table.text); 
END IF; 
END; 
$$ Language 'plpgsql'; 

DO $$ BEGIN 
PERFORM upsert_test(id,text) FROM test; 
END $$; 

Also, was muss ich auch der Einsatz bekommen ändern zu arbeiten?

+0

Unrelated, aber: die Sprache Name ist ein Bezeichner. Setzen Sie es nicht in einzelne Anführungszeichen verwenden: 'Sprache plpgsql' –

Antwort

4

Angenommen, Sie haben eine primäre oder eindeutige Einschränkung auf dem id Spalten Sie dies mit einer einzigen Anweisung tun können, keine Funktion erforderlich:

insert into test (id, text) 
select id, text 
from tmp_table 
on conflict (id) 
    do update set text = excluded.text; 
+0

Ja, ich habe das zuerst versucht, aber ich habe immer den Fehler: mehr als eine Zeile von einer Unterabfrage zurückgegeben – StackAsk

+0

@StackAsk: dann verwendeten Sie eine andere Abfrage. Die Abfrage in der Antwort führt nicht zu diesem Fehler –

+0

Oh ja, mein Schlechter. Hat gut funktioniert. Vielen Dank! – StackAsk

Verwandte Themen