2016-04-20 10 views
0

Ich weiß nicht, ob dies ein Fehler, eine Funktion oder ein Problem in der Dokumentation ist.Wie bekomme ich ID der Zeile eingefügt auf Postgres 9.5 UPSERT

Sagen wir, ich diese Tabelle haben:

CREATE TABLE tags(
    id BIGSERIAL PRIMARY KEY, 
    value TEXT UNIQUE NOT NULL, 
    creation_time TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP 
); 

Wenn Sie INSERT INTO tags(value) VALUES('a') RETURNING id; laufen Sie die ID des neu eingefügten Wert erhalten ABER:

es wieder Laufen mit INSERT INTO tags(value) VALUES('a') ON CONFLICT(value) DO NOTHING RETURNING idNO geben ID, das bedeutet, entweder ist ein Fehler oder die Dokumentation ist falsch, weil Dokumentation http://www.postgresql.org/docs/9.5/static/sql-insert.html lautet:

INSERT INTO table_name [ AS alias ] [ (column_name [, ...]) ] 
    { DEFAULT VALUES | VALUES ({ expression | DEFAULT } [, ...]) [, ...] | query } 
    [ ON CONFLICT [ conflict_target ] conflict_action ] 
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] 

Dies bedeutet im Grunde, dass Sie CAN beide verwenden, hat jemand dieses gleiche Problem finden und es gelöst?

Antwort

2

Die Dokumentation ist richtig und es gibt keinen Fehler. Sie diesen Teil übersehen:

Die optionale RÜCKKEHR Klausel bewirkt, dass INSERT berechnen und Rückgabewert (e) basierend auf jeder Zeile tatsächlich eingefügt (oder aktualisiert, wenn ein KONFLIKT UPDATE-Klausel DO wurde verwendet,

)

(Hervorhebung von mir)

Wenn Sie DO NOTHING geben Sie dann die Anweisung wird weder inse rt noch nichts updaten und kann daher keine ID zurückgeben.