update

Habe folgende Tabelle als Beispiel:

Artikel Zeit id

Artikel1 10:11 2
Artikel2 11:22 3
Artikel1 09:10 1
Artikel3 10:09 2
Artikel2 08:20 2
Artikel2 08:00 1
Artikel3 10:00 1

Möchte nun die Spalte id nachträglich füllen.
Finde keine richtige Lösung.
Wer kann helfen.

Danke

Da steht doch schon was drin, was ist Dein Problem?

Btw.: hat Deine Tabelle einen PK? Welchen Datentyp hat die Zeit-Spalte? Sieht nicht nach einer wirklichen timestamp-Spalte aus…


Andreas

Hallo Andreas,

die Tabelle habe ich nur etwas verallgemeinert.

Also jetzt genauer:
Die Spalte Artikel und Zeit sind der PK.
Typ von Zeit ist timestamp.
Spalte id ist leer und muß nachträglich gefüllt werden.
Soll eine einmalige Aktion sein, später dann mit Insert-Trigger in der Form

BEGIN
new.id=(select max(id) from tabelle where artikel = new.artikel group by artikel)+1;
RETURN new;
END;

Geht auch schon, muß eben nur noch die id Werte vor Einsatz des Triggers generieren.

Holger

Wozu braucht man das?


Geht auch schon, muß eben nur noch die id Werte vor Einsatz des Triggers generieren.

Holger

Nun denn, ein Einzeiler:

test=# \d rabbit
     Table "public.rabbit"
 Column  |  Type   | Modifiers
---------+---------+-----------
 artikel | text    |
 zeit    | text    |
 id      | integer |

test=# select * from rabbit ;
 artikel  | zeit  | id
----------+-------+----
 Artikel1 | 10:11 |
 Artikel2 | 11:22 |
 Artikel1 | 09:10 |
 Artikel3 | 10:09 |
 Artikel2 | 08:20 |
 Artikel2 | 08:00 |
 Artikel3 | 10:00 |
(7 rows)

Time: 0.985 ms
test=*# create or replace function f_r(OUT _a text, OUT _t text, OUT _i int) returns setof record as $$declare r record;a text; t text;i int;begin i:=0; a:='';t:='';for r in select * from rabbit order by artikel, zeit loop if a!=r.artikel then i:=1; end if;_a:=r.artikel;_t:=r.zeit;_i:=i; i:=i+1; a:=r.artikel; return next; end loop; end; $$language plpgsql;
CREATE FUNCTION
Time: 2.930 ms
test=*# select * from f_r();

    _a    |  _t   | _i
----------+-------+----
 Artikel1 | 09:10 |  1
 Artikel1 | 10:11 |  2
 Artikel2 | 08:00 |  1
 Artikel2 | 08:20 |  2
 Artikel2 | 11:22 |  3
 Artikel3 | 10:00 |  1
 Artikel3 | 10:09 |  2
(7 rows)

Time: 3.302 ms
test=*#

Damit dann Deine Tabelle zu updaten überlasse ich Dir zur Übung.

Andreas

update mySchema.“myTable”
set myIdColumn = nextval(‘mySchema.“myTable_myIdColumn_seq”’::regclass);

voila

ich hab das jetzt mal ein bissel verallgemeinert …

das funktioniert auf jeden fall einfach mal so, wenn die Tabelle sowie den Primary-Key (autowert) mit dem PGAdmin erzeugt hast. Dann sollte für diesen Primary-Key eben auch eine entsprechende Sequence existieren … (diese Sequence sollte sich ueber eben diesen PGAdmin leicht ermitteln lassen -> Table wählen und rechts Reiter “Abhängige” anzeigen)

Also du kannst dir natürlich so eine Sequence auch selbst basteln - aber ich denke mal das brauchst du nicht - weil schon alles da.

Gruß
Steffen

— NACHTRACH —
wenn du keine Seqence auf deiner id-spalte hast und eine moechtest
CREATE SEQUENCE mySchema.“mySequence”
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;

ALTER TABLE mySchema.“myTable_myIdColumn_seq” OWNER TO <der owner eben - am besten jener von der Tabelle>;

Von einer Sequenz war keine Rede.

ich hab das jetzt mal ein bissel verallgemeinert …

das funktioniert auf jeden fall einfach mal so, wenn die Tabelle sowie den Primary-Key (autowert) mit dem PGAdmin erzeugt hast.

Der PK geht über (artikel,zeit).

Dann sollte für diesen Primary-Key eben auch eine entsprechende > Sequence > existieren … (diese > Sequence > sollte sich ueber eben diesen PGAdmin leicht ermitteln lassen → Table wählen und rechts Reiter “Abhängige” anzeigen)

Wird nicht funktionieren.

Also du kannst dir natürlich so eine > Sequence > auch selbst basteln - aber ich denke mal das brauchst du nicht - weil schon alles da.

Gruß
Steffen

Er wird mehrere Sequencen brauchen - für jeden Artikel eine.

Andreas

er will mit max(id) ne id-spalte fuellen - da muessen doch die alarmglocken laeuten … er redet von einer einmaligen aktion - weil der bisherige key nicht mehr der zukuenftige sein wird … er will eine id-spalte einfuehren …

da braucht er ne sequence … eine … fuer die id …

ferdsch

Nein, schaue Dir mal die Triggerfuktion etwas genauer an, die er zeigte. Und Du wirst sehen, was Du bis jetzt übersehen hast.

Andreas

denn aus quatsch folgt quatsch … warum sollte man auf unsinn ruecksicht nehmen? Sein Problem ist abstrakter. Und schreit nach einer einfachen Lösung.

Keep it simple

Ähm. Der Fragesteller will sowas wie eine fortlaufende Zählung nach einer Gruppierung, diese Spalte als id zu bezeichnen ist allerdings irreführend. Das ändert nix daran, daß es ein Stück weit unhöflich ist, sein Problem als Quatsch zu bezeichnen ohne eine Lösung bieten zu können.

Davon abgesehen, mir ist egal, wie DU Dich hier zum Affen machst. Du bist nicht verpflichtet zu antworten, insbesondere dann, wenn Du nix inhaltliches beitragen kannst. Man kann es Dir allerdings auch nicht verbieten. Ich zumindest nicht.

Falls Du ein Problem mit meiner Person hast, dann sag mir das per eMail und vergewaltige nicht das Forum.

Andreas

  • der “persönlich” wird

denk mal drüber nach.

und zweitens … habe ich sehrwohl gesehen, dass er da groben Unfug anstellt um einen “PRIMARY KEY” zu erzeugen. In seinem Beispiel sind doppelt PK’s vorhanden - es muss sich damit also um fehlerhafte Daten handeln - eben sein Problem - keine richtigen Keys erzeugen zu können.
Daher denke ich, dass am besten geholfen ist, wenn man darauf aufmerksam macht.

Damit reduziert sich sein Problem auf die Erzeugung eindeutiger Schluesselwerte - eben Primary Keys - die wie er sagt für bestehende Daten erzeugen möchte. Der Trigger wäre mit der Sequence auch obsolete und das Ganze wesentlich näher am konventionellen Weg.

Denk mal drüber nach

Welche?

  • es muss sich damit also um fehlerhafte Daten handeln

Behauptung ohne Beweis.

Damit reduziert sich sein Problem auf die Erzeugung eindeutiger Schluesselwerte - eben Primary Keys - die wie er sagt für bestehende Daten erzeugen möchte.

Nein.

Der Trigger wäre mit der Sequence auch obsolete und das Ganze wesentlich näher am konventionellen Weg.

Nein.

Denk mal drüber nach

Jepp.

Andreas

Richtig lesen mein Gutster …

es ist eine Beispiel-Tabelle … wie er die erzeugt hat ist uninteressant… er spricht bei der Spalte id von einem PK - fuer den die obigen Daten einfach nicht die Kriterien erfuellen die eine Spalte zu einem PK machen.

Denk mal intensiver drüber nach

Nein. Der PK liegt weder auf id noch soll er es tun. Der PK ist anders definiert, das sagte der Fragesteller bereits einmal, und ich habe es extra für Dich nochmals wiederholt. Wer lesen kann, ist klar im Vorteil.

Gut nun?

Andreas

andere verstehen schon

So, ich beende das hier nun mal. Sollte jemand etwas sinnvolles Posten wollen bitte kurz Info an mich dann mache ich den Thread wieder auf. Ansonsten bring das hin und her niemanden etwas.

cu tb.