Update Anweisung mit PG 11 und SET

Fragen und Probleme rund um die Abfragespache SQL.
Antworten
Werner21
Neuer Benutzer
Beiträge: 12
Registriert: Mi 1. Aug 2018, 15:05

Update Anweisung mit PG 11 und SET

Beitrag von Werner21 » So 9. Dez 2018, 21:56

Servus,

wir haben umgestellt von PG 9.5 auf 11.1, jetzt funktioniert ein

Code: Alles auswählen

update xyz SET (bestellstatus) = ('Komplett abgeschlossen') WHERE bestellnr = '20442'
nicht mehr.

Ist nur eine Spalte betroffen, muss das unter 11.1 so geschrieben werden:

Code: Alles auswählen

update shopware SET bestellstatus = 'Komplett abgeschlossen' WHERE bestellnr = '20442'
warum?

Was hat sich da noch geändert, konnte das nirgends in einer Doku finden.

Danke!
Servus,

Werner

castorp
Erfahrener Benutzer
Beiträge: 1130
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Update Anweisung mit PG 11 und SET

Beitrag von castorp » So 9. Dez 2018, 22:05

Die Klammern sind doch sowieso komplett sinnlos.

Grund dafür ist aber, dass seit 9.6 auch Updates dieser Art zulässig sind:

Code: Alles auswählen

update foo
  set (a,b) = (select c,d from ..)
where ...
Und in dem Moment wo die Spalte(n) in Klammer stehen, muss auf der rechten Seite ein Sub-Select stehen.

Das zeigt mal wieder, dass die Unsitte zu viele Klammer zu setzen sehr häufig mehr als nur eine schlechte Idee ist.
In Postgres mehr als in anderen Datenbanken. In Postgres ist nämlich "select a,b" etwas anderes als z.B. "select (a,b)"
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

Werner21
Neuer Benutzer
Beiträge: 12
Registriert: Mi 1. Aug 2018, 15:05

Re: Update Anweisung mit PG 11 und SET

Beitrag von Werner21 » So 9. Dez 2018, 22:50

castorp hat geschrieben:
So 9. Dez 2018, 22:05
Die Klammern sind doch sowieso komplett sinnlos.
Nicht, wenn man sich den update-String in einer Anwendung zusammenbastelt, bisher musste ich da keinen Unterschied machen.
Servus,

Werner

castorp
Erfahrener Benutzer
Beiträge: 1130
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Update Anweisung mit PG 11 und SET

Beitrag von castorp » Mo 10. Dez 2018, 07:34

Ich verstehe nicht warum man da überhaupt einen "Unterschied" machen muss. Ein einzelne Spalte oder einen (skalaren) Wert in Klammer zu setzen ist immer unnötig, egal in welchem Kontext. Und auf der linken Seite einer Zuweisung sowieso.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

Werner21
Neuer Benutzer
Beiträge: 12
Registriert: Mi 1. Aug 2018, 15:05

Re: Update Anweisung mit PG 11 und SET

Beitrag von Werner21 » Mo 10. Dez 2018, 14:45

castorp hat geschrieben:
Mo 10. Dez 2018, 07:34
Ich verstehe nicht warum man da überhaupt einen "Unterschied" machen muss. Ein einzelne Spalte oder einen (skalaren) Wert in Klammer zu setzen ist immer unnötig, egal in welchem Kontext. Und auf der linken Seite einer Zuweisung sowieso.
Jetzt muss man einen machen, vorher wars egal. Es gibt halt eine Methode in meiner Klasse, die den update-String zusammenbastelt. Bisher war es egal, ob 1 Spalte oder 1000 dabei rauskommen.
Servus,

Werner

castorp
Erfahrener Benutzer
Beiträge: 1130
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Update Anweisung mit PG 11 und SET

Beitrag von castorp » Mo 10. Dez 2018, 15:02

Vorher war es nicht egal - da konnte man gar nicht mehrere Spalten beim SET angeben. "UPDATE ... set (a,b) = (...)" war gar nicht zulässig
Zuletzt geändert von castorp am Mo 10. Dez 2018, 15:10, insgesamt 1-mal geändert.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

akretschmer
Erfahrener Benutzer
Beiträge: 7619
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Update Anweisung mit PG 11 und SET

Beitrag von akretschmer » Mo 10. Dez 2018, 15:08

das kam schon in 10:



Use standard row constructor syntax in UPDATE ... SET (column_list) = row_constructor (Tom Lane)

The row_constructor can now begin with the keyword ROW; previously that had to be omitted. If just one column name appears in the column_list, then the row_constructor now must use the ROW keyword, since otherwise it is not a valid row constructor but just a parenthesized expression. Also, an occurrence of table_name.* within the row_constructor is now expanded into multiple columns, as occurs in other uses of row_constructors.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

akretschmer
Erfahrener Benutzer
Beiträge: 7619
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Update Anweisung mit PG 11 und SET

Beitrag von akretschmer » Mo 10. Dez 2018, 15:11

castorp hat geschrieben:
Mo 10. Dez 2018, 15:02
Vorher war es nicht egal - da konnte man gar nicht mehrere Spalten beim SET angeben. "UPDATE ... set (a,b) = (...)" war gar nicht zulässig
doch, ging in 9.5

Code: Alles auswählen

test=*# create table foo(a int, b int, c int);
CREATE TABLE
test=*# update foo set (a,b) = (2,3);
UPDATE 0
test=*# insert into foo values (1,2,3);
INSERT 0 1
test=*# update foo set (a,b) = (2,3);
UPDATE 1
test=*# select * from foo;
 a | b | c 
---+---+---
 2 | 3 | 3
(1 row)

test=*# select version();
                                                                     version                                                                     
-------------------------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.5.15 on x86_64-pc-linux-gnu (Ubuntu 9.5.15-1.pgdg16.04+1), compiled by gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609, 64-bit
(1 row)

test=*# 
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

castorp
Erfahrener Benutzer
Beiträge: 1130
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Update Anweisung mit PG 11 und SET

Beitrag von castorp » Mo 10. Dez 2018, 15:20

OK, danke. Wieder was gelernt.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

Antworten