2016-04-13 6 views
0

Ich habe Probleme mit dem folgenden (in PostgreSQL).Verwenden von nextval zum Einfügen neuer Daten in Tabelle aus der temporären Tabelle

Zweck:

  • gelesenen Daten aus temporärer Tabelle tmp
  • Prozess diese an einem anderen Tisch y
  • verwenden die nextval aus Tabelle y mit Daten kombiniert aus tmp.

Ich dachte, das die Arbeit machen würde:

INSERT INTO y (v1, v2) VALUES (nextval(y.v1), SELECT v2 FROM tmp) 

auch versucht:

INSERT INTO y (v1, v2) VALUES (SELECT nextval(y.v1), v2 FROM tmp) 

kann jemand erklären, wie dies zu tun?

+0

Benötigen Sie für alle aus tmp gelesenen Datensätze einen einzelnen Wert von 'v1'? – Quassnoi

+0

ja, diese Abfrage ist geloopt, also ein einzelner Wert (die nächste ID) ist was ich hier brauche. – appolonius

Antwort

0

Es gibt zwei Missverständnisse/Fehler im Code haben Sie gezeigt:

  1. nextval() erwartet, dass der Name einer Sequenz, nicht ein Spaltenname.
  2. Wenn ein select Anweisung verwendet wird, um die Daten für eine insert Erklärung zu liefern, können Sie nicht values()

verwenden Ich denke Sie etwas wollen, wie ist:

insert into y (v1, v2) 
select nextval(...), v2 
from tmp; 

Es ist unklar, zu mir, was du meinst mit "benutze das nextval von der Tabelle y". Wie bereits erwähnt, arbeitet nextval() mit Sequenzen, die nicht auf Tabellen oder Spalten basieren. Wenn Sie meinen, „aus der Sequenz der nextval nehmen im Zusammenhang mit y.v1“ und y.v1 als serial Spalte definiert man so etwas tun kann:

insert into y (v1, v2) 
select nextval(pg_get_serial_sequence('y','v1')), v2 
from tmp; 

Aber dies erfordert v1 als serial

definiert werden
+0

Danke, ich werde das später noch genauer untersuchen. Deine Eingabe hat mir einiges klargemacht! – appolonius

Verwandte Themen