Re: Wert in einer Tabelle fortschreiben.

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