Lists: | pgsql-de-allgemein |
---|
From: | Guenther Boelter <gboelter(at)gmail(dot)com> |
---|---|
To: | "pgsql-de-allgemein(at)postgresql(dot)org Allgemein" <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Wert in einer Tabelle fortschreiben. |
Date: | 2014-01-09 12:18:11 |
Message-ID: | 52CE9383.1020709@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
Moin Moin!<br>
<br>
Ich habe eine Tabelle 'nummernkreise'. die lediglich aus den Feldern
'id', 'name' und 'wert' besteht. <br>
<br>
<font face="monospace"><font face="Courier 10 Pitch">id name
wert<br>
1 RechnungsNr 4711<br>
2 AuftragsNr 5881</font><br>
</font><br>
Insgesamt gibt es in dieser Tabelle nur so etwa 20 Datensaetze.<br>
<br>
Wird jetzt zum Beispiel eine neue Rechnung erstellt, dann holt sich
mein Programm die aktuelle Rechnungsnummer aus der Tabelle, erhoeht
diese um 1 und schreibt den neuen Wert fuer die naechste Rechnung in
die Datenbank. Das faellt jetzt sicherlich unter die Rubrik 'Mit
Kanonen auf Spatzen' schiessen, aber es geht mir ums Prinzip.<br>
<br>
Da ich unbedingt vermeiden will, dass der Wert zwischen einem SELECT
und einem anschliessenden Update zwsichenzeitlich in der Datenbank
geaendert wurde, habe ich mich zu folgender Abfrage entschlossen:<br>
<br>
UPDATE nummernkreise SET wert = wert+1 WHERE name = 'Angebot'
RETURNING wert;<br>
<br>
Das klappt auch einwandfrei. Dennoch mal die Frage an euch, ist
diese Query so in Ordnung oder wuerdet ihr das anders loesen?<br>
<br>
Ich habe leider zu viele Jahre mit MySQL gearbeitet, wo man sich
derartige Gedanken halt eher nicht macht solange es denn
funktioniert oder zu funktionieren scheint. Und nachdem ich Monate
gebraucht habe meine Software um PostgreSQL zu erweitern - was
inzwischen auch gut laeuft - opfere ich jetzt ein paar Monate mehr,
um MySQL ganz rauszuwerfen und bei der Gelegenheit auch meine
Queries zu optimieren.<br>
<br>
Falls es wichtig ist, ich programmiere unter Linux und verwende
aktuell PostgreSQL 9.2.<br>
<br>
Gruss<br>
<br>
Guenther<br>
<pre class="moz-signature" cols="72">--
DavaoSOFT, the home of ERPel
ERPel, das deutsche Warenwirtschaftssystem fuer LINUX
<a class="moz-txt-link-freetext" href="http://www.davaosoft.com">http://www.davaosoft.com</a></pre>
</body>
</html>
Attachment | Content-Type | Size |
---|---|---|
unknown_filename | text/html | 2.2 KB |
From: | Thomas Markus <t(dot)markus(at)proventis(dot)net> |
---|---|
To: | Guenther Boelter <gboelter(at)gmail(dot)com>, "pgsql-de-allgemein(at)postgresql(dot)org Allgemein" <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: Wert in einer Tabelle fortschreiben. |
Date: | 2014-01-09 12:21:19 |
Message-ID: | 52CE943F.9080607@proventis.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
Am 09.01.2014 13:18, schrieb Guenther Boelter:
> Moin Moin!
Hi,
dafür gibt es die Sequence. Schau dir die mal an
Gruss
Thomas
From: | "Andreas Kretschmer - internet24 GmbH" <kretschmer(at)internet24(dot)de> |
---|---|
To: | "'Guenther Boelter'" <gboelter(at)gmail(dot)com>, <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: Wert in einer Tabelle fortschreiben. |
Date: | 2014-01-09 12:22:22 |
Message-ID: | 00db01cf0d35edf960c9ec20$@internet24.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
> -----Ursprüngliche Nachricht-----
>
> UPDATE nummernkreise SET wert = wert+1 WHERE name = 'Angebot' RETURNING
> wert;
>
>
> Ich habe leider zu viele Jahre mit MySQL gearbeitet, wo man sich
MySQL hinterläßt halt Schäden ;-)
Der PG-Weg wäre hier die Verwendung von Sequencen. Die sind sicher, da kann nix passieren.
Andreas
From: | Guenther Boelter <gboelter(at)gmail(dot)com> |
---|---|
To: | "pgsql-de-allgemein(at)postgresql(dot)org Allgemein" <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: Wert in einer Tabelle fortschreiben. |
Date: | 2014-01-09 12:34:44 |
Message-ID: | 52CE9764.5070809@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix">On 01/09/2014 08:18 PM, Guenther
Boelter wrote:<br>
</div>
<blockquote cite="mid:52CE9383(dot)1020709(at)gmail(dot)com" type="cite">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<br>
Das klappt auch einwandfrei. Dennoch mal die Frage an euch, ist
diese Query so in Ordnung oder wuerdet ihr das anders loesen?</blockquote>
<br>
Ok, wenn ihr meint, dann baue ich das mal um ...<br>
<br>
Sequence'n hatte ich mir zwar auch schon angesehen, bin aber davon
ausgegangen, dass das nun doch 'ne Nummer zu gross waere fuer diese
dreieinhalb Daten. Ist es aber anscheinend ja nicht.<br>
<br>
Und was MySQL angeht, ja Andreas, da stimme ich Dir mittlerweile
uneingeschraenkt zu. Habe ich aber auch erst in den letzten Monaten
begriffen, als ich mich dann doch mal - freiwillig - intensiv mit
PostgreSQL beschaeftigt habe.<br>
<br>
Gruss<br>
<br>
Guenther<br>
<br>
<br>
</body>
</html>
Attachment | Content-Type | Size |
---|---|---|
unknown_filename | text/html | 1.1 KB |
From: | "Andreas Kretschmer - internet24 GmbH" <kretschmer(at)internet24(dot)de> |
---|---|
To: | "'Guenther Boelter'" <gboelter(at)gmail(dot)com>, <pgsql-de-allgemein(at)postgresql(dot)org> |
Subject: | Re: Wert in einer Tabelle fortschreiben. |
Date: | 2014-01-09 12:59:56 |
Message-ID: | 017901cf0d3a$b23907e0ab17a0$@internet24.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-de-allgemein |
> Sequence'n hatte ich mir zwar auch schon angesehen, bin aber davon
> ausgegangen, dass das nun doch 'ne Nummer zu gross waere fuer diese
> dreieinhalb Daten. Ist es aber anscheinend ja nicht.
Also, um das noch mal klarzustellen: wenn Du darauf angewiesen bist, daß die Nummern wirklich frei von Lücken sind, dann hast bei Sequencen ein Problem, wenn eine Transaktion scheitert. Sequencen kennen kein ROLLBACK, eine einmal gezogene Nummer ist weg.
Also, du ziehst 4711 als Rechnungsnummer, dann kommt es aber zu einem Rollback. Deine letzte Rechnungsnummer ist 4710, die nächste 4712.
Wenn Du damit leben kannst, dann okay. Falls nicht: bleib bei Deiner Lösung. Durch das RETURNING ist das alles eine einzelne Transaktion, sollte also auch 'safe' sein.
>
> Und was MySQL angeht, ja Andreas, da stimme ich Dir mittlerweile
> uneingeschraenkt zu. Habe ich aber auch erst in den letzten Monaten
> begriffen, als ich mich dann doch mal - freiwillig - intensiv mit
> PostgreSQL beschaeftigt habe.
Es sind einfach die Features von PG, wo MySQL noch um Lichtjahre weg ist.
Andreas