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
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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:
Damit dann Deine Tabelle zu updaten überlasse ich Dir zur Übung.Code: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=*#
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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>;
Geändert von symbiont (25.03.2008 um 18:03 Uhr)
Von einer Sequenz war keine Rede.
Der PK geht über (artikel,zeit).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.
Wird nicht funktionieren.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)
Er wird mehrere Sequencen brauchen - für jeden Artikel eine.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
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen