2016-11-02 5 views
1

Ich möchte eine Zeile mit einer Insert-Anweisung aktualisieren. In der Tat kann ich Zeilen einfügen, aber wenn das eindeutige Attribut bereits existiert, möchte ich den Inhalt aktualisieren.Neuen Wert für Konflikt aktualisieren

Also habe ich diese Tabellen

CREATE TABLE dtest (
    "id" text, 
    followers_count int4, 
    someuniq int4 
); 
CREATE UNIQUE INDEX dtest_idx ON dtest USING btree (someuniq); 

CREATE TABLE temp_data (
    tid text, 
    tfo int4, 
    tuniq int4); 

Betrachten sie, dass ich ein temporäres Register, und ich insert/update Daten aus dieser Tabelle

INSERT INTO temp_data VALUES ('id1',4,1); 
INSERT INTO temp_data VALUES ('id2',0,2); 
INSERT INTO temp_data VALUES ('id3',40,3); 


INSERT INTO dtest("id","followers_count","someuniq") 
SELECT t.tid, t.tfo, t.tuniq 
FROM temp_data t 
ON CONFLICT DO NOTHING; 

Statt einen Einsatz zu tun, und dann ein Update Ich würde gerne wissen, ob es möglich ist, die Werte mit so etwas zu aktualisieren

INSERT INTO dtest("id","followers_count","someuniq") 
SELECT tid, tfo, tuniq 
FROM temp_data 
ON CONFLICT ("someuniq") 
DO UPDATE SET followers_count = 
     (SELECT tfo FROM temp_data where tid = EXCLUDED.tid) 
    WHERE EXCLUDED.id = tid; 

Wic h bedeutet, "Aktualisieren Sie einige Felder, wenn die Zeile bereits existiert", was mache ich falsch?

Antwort

1

Es ist nicht notwendig, eine Unterauswahl zu verwenden. Die Zeile excluded enthält alle Zielspalten, einschließlich der followers_count:

INSERT INTO dtest (id, followers_count, someuniq) 
SELECT tid, tfo, tuniq 
FROM temp_data 
ON CONFLICT (someuniq) 
DO UPDATE 
    SET followers_count = excluded.followers_count; 
Verwandte Themen