
Zitat von
pantarhei
Hallo,
ich weiss gerade nicht genau wie ich die Überschrift besser nennen sollte.
Ich versuche mal zu erklären was ich versuche zu erreichen. Eigentlich ganz einfach, nur werd ichs wohl wieder unheimlich umständlich erklären.
Ich brauche in einer Tabelle einen Trigger der wie eine Sequenz arbeitet.
Dieser Trigger soll vor dem Speichern ausgelöst werden, und mir einen Werte in dem neuen Datensatz eintragen. Dieser Werte ergibt sich aus der Anzahl der vorhandenen Datensätze + 1.
Warum so umständlich? Du willst wissen, wieviel Transaktionen pro Kunde getätigt wurden. Entweder du zählst das starr in einer table und hast dann Probleme mit Mehrfachzugriff, Update und Delete von Datensätzen etc. oder machst einfach einen View:
Code:
test=# create table kunde (id serial primary key, name text);
NOTICE: CREATE TABLE will create implicit sequence "kunde_id_seq" for serial column "kunde.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "kunde_pkey" for table "kunde"
CREATE TABLE
test=*# create table kunde_tx (kunde_id int references kunde(id), ts timestamp);
CREATE TABLE
test=# create view kunde_view as select a.id, a.name, count(b) from kunde a left join kunde_tx b on(a.id=b.kunde_id) group by id, name;
CREATE VIEW
-- einige inserts
test=# select * from kunde_view ;
id | name | count
----+------+-------
1 | ich | 2
2 | du | 1
3 | er | 0
(3 rows)
test=*# select * from kunde_tx ;
kunde_id | ts
----------+----------------------------
1 | 2007-07-17 15:44:06.156817
1 | 2007-07-17 15:44:10.522831
2 | 2007-07-17 15:44:15.178443
Beispiel: Ich habe zwei Tabellen. Kunde und Transaktionen. Der Kunde wird über kunde_id in der Transaktionen Tabelle referenziert. Sobald jetzt eine neue Transaktion angelegt wird, soll der Trigger mein "Zählfeld" auf "Anzahl der Transaktoinen dieses Kunden" + 1 setzen. Das Ganze soll, bzw. muss aber dann auch so sein, dass der nächste Datensatz die nächst höhere Nummer bekommt. Also dass wenn 3 Anfragen zur gleichen Zeit ankommen, darf keine dieser drei Anfragen den gleichen Wert des Inkrements erhalten. Prinzipiell so wie eine Sequenz es auf ein Feld macht, aber eben nicht einfach um eins hochzählen, sondern eben in Abhängigkeit der vorhandenen Datensätze.
Vermutlich wirst Du dann mit 'select for update' arbeiten müssen, um eine Sperre auf den Kundendatensatz zu machen.
Andreas
Lesezeichen