![]() |
Datenbank: Firebird • Version: V2.1 • Zugriff über: ZEOS
Anzahl Datensätze einer Tabelle beschränken
Hallo,
hab mal eine Frage zum beschränken von Datensätzen einer Tabelle. Ich habe vor über die Anzahl der Datensätze, die ich in eine Tabelle schreiben kann, einen Ringspeicher zu erstellen, um das Datenaufkommen zu minimieren. Soll heißen, ich möchte die Anzahl der Datensätze einer Tabelle auf 500000 beschränken. Die Tabelle soll aber nicht voll werden, sondern nach dem 500000 Datensatz soll der älteste Überschrieben werden. (Ringspeicher). Muss ich diese Funktion mit INSERT und DELETE selber schreiben, oder kann ich das mit Firebird automatisch realisieren. Danke schon mal Gruß Jens |
Re: Anzahl Datensätze einer Tabelle beschränken
Man könnte versuchen, dies im After-Insert-Trigger zu bewerkstelligen
|
Re: Anzahl Datensätze einer Tabelle beschränken
Alles klar,
danke werde ich mal versuchen. Gruß Jens |
Re: Anzahl Datensätze einer Tabelle beschränken
Ich wollte auch mal sowas machen, allerdings mit MySQL.
![]() Mit Events ist es aber natürlich eleganter. |
Re: Anzahl Datensätze einer Tabelle beschränken
Trigger ? :shock: Immer dieses DB-Gefummele. :mrgreen:
Delphi-Quellcode:
Schönes Beispiel wofür die ganzen Dataset-Methoden da sind. :zwinker:
procedure TForm1.btn1Click(Sender: TObject);
var Anz : Integer; begin DS1.Close; DS1.SelectSQL.Text := 'SELECT COUNT (*) AS ANZ FROM TESTTABLE'; DS1.Open; // ^^ momentane Anzahl ermitteln Anz := DS1.FieldByName ('ANZ').AsInteger; lbl1.Caption := IntToStr(Anz); if Anz > 3 then begin DS1.Close; DS1.SelectSQL.Text := 'SELECT * FROM TESTTABLE'; // alle lesen DS1.Open; DS1.First; DS1.Delete; // ältesten DS löschen DS1.Last; DS1.Insert; // hinter neuestem DS komplett neuen einfügen DS1.FieldByName('CITYNO').AsInteger := Anz; DS1.Post; Transaction1.Commit; DB1.Close; Close; // Form schliessen end; end; P.S.: elegant ist eher, die DB in Ruhe zu lassen und die dafür gedachten Methoden auch zu benutzen. |
Re: Anzahl Datensätze einer Tabelle beschränken
Woher willst Du bei Deiner Methode denn wissen, dass Du den ältesten DS erwischst? Und wieso fragst Du alle ab? Ich verstehe die Logik dahinter nicht, ehrlich gesagt.
|
Re: Anzahl Datensätze einer Tabelle beschränken
Zitat:
|
Re: Anzahl Datensätze einer Tabelle beschränken
Zitat:
|
Re: Anzahl Datensätze einer Tabelle beschränken
Also ich denke das ich es auch mit einem Trigger versuchen werde.
Ich sehe allein den Vorteil darin, das ich jederzeit den Trigger der Datenbank anpassen kann, ohne mein Programm anpacken zu müssen. Gruß Jens |
Re: Anzahl Datensätze einer Tabelle beschränken
Zudem würde das auch unabhängig vom Programm funktionieren
|
Re: Anzahl Datensätze einer Tabelle beschränken
Zitat:
Nächster Vorschlag :
Delphi-Quellcode:
Wo bleibt denn eigentlich der Trigger ? :shock: :mrgreen:
procedure TForm1.btn1Click(Sender: TObject);
var Anz : Integer; MinID, MaxID : Integer; begin DS1.Close; DS1.SelectSQL.Text := 'SELECT MIN (ID) AS IDMIN FROM TESTTABLE'; DS1.Open; // ^^ momentane Anzahl ermitteln MinID := DS1.FieldByName ('IDMIN').AsInteger; DS1.Close; DS1.SelectSQL.Text := 'SELECT MAX (ID) AS IDMAX FROM TESTTABLE'; DS1.Open; MaxID := DS1.FieldByName ('IDMAX').AsInteger; if MaxID > 3 then begin DS1.Close; DS1.SelectSQL.Text := 'DELETE FROM TESTTABLE WHERE ID ='+IntToStr (MinID); DS1.Open; DS1.Close; DS1.SelectSQL.Text := 'SELECT * FROM TESTTABLE WHERE ID ='+IntToStr (MaxID); DS1.Open; DS1.Insert; DS1.FieldByName('CITYNO').AsInteger := MaxID + 1; DS1.Post; Transaction1.Commit; DB1.Close; Close; // Form schliessen end; end; Zitat:
|
Re: Anzahl Datensätze einer Tabelle beschränken
Zitat:
|
Re: Anzahl Datensätze einer Tabelle beschränken
Ein Order By mitzuschleppen ist in diesem Fall unnötig. Wenn das fehlt wird nach dem primary key sortiert. Sofern es eine fortlaufende interne ID gibt, dann geht das schon so. Wo steht übrigens was von Planungsphase ? :shock: Aber egal. Mein zweiter Vorschlag lässt sich wohl auch einfach in einem Trigger realisieren. Da es aber auch um Lösch-Operationen geht : man muss sich klar darüber sein, dass ein Trigger zuschlägt, ohne wenn und aber. Der kennt weder Freund noch Feind !
|
Re: Anzahl Datensätze einer Tabelle beschränken
Zitat:
before insert trigger: ======= new.id = gen_id(mytableid,1); if (new.id > 500000) then delete from mytable where id=new.id-500000; ======= Das wars. Wo ist das Problem? |
Re: Anzahl Datensätze einer Tabelle beschränken
Wenn man bei jedem Einfügen gleich den ältesten Datensatz löscht (weil der Ringpuffer voll ist) verursacht das hohe
Kosten in Bezug auf Performance und Fragmentierung der DB. Daher sollte man das Löschen der alten Daten besser gesammelt zu einem definierten Zeitpunkt (z.B. Programmende, einmal pro Woche,...) vornehmen. Das hat folgende Vorteile: * bessere Performance während des normalen Programmablaufs * Fragmentierung bleibt geringer * die Programmlogik ist klarer, weil das Löschen quasi an eine andere Stelle ausgelagert wurde * flexibler - Anwender kann z.B. wählen zwischen "max. Anzahl der Records" oder "Alles älter als 6 Monate löschen". * das Löschen alter Daten könnte auch nachts gesteuert über ein Script ablaufen. * das Löschen kann auch mit einer Archivierung verbunden werden |
Re: Anzahl Datensätze einer Tabelle beschränken
Zitat:
Bemerkung: Hi :-D Man sollte immer, falls möglich, nach Lösungen suchen die Zukunftsorientiert sind und überall nach gleichem Prinzip anwendbar. Ich kann an einem Tag auch 500000 Datensätze erzeugen. Dann es ist wirklich schwer von einem ältesten Datensatz zu sprächen. Wird einen Datensatz mit einer vermeidlich „älteren“ ID bearbeitet (z.B.: gestern) und anschließend gespeichert ist er, wie ich meine, nicht mehr so alt wie vermutet. So oder so eine ID darf in keinem Fall ein Maßstab für solche Handlungen sein, da eben solche Probleme werden normalerweise via DATUM, die in einem solchen Datensatz enthalten sein sollte, gelöst. Und auch, wenn Datensätze nie bearbeitet werden sollen, sich auf eine ID zu verlassen, ist nicht empfehlenswert, da das oberste Gebot ist: Ich behalte die Kontrolle, und ich entscheide was alt ist und was nicht. Gruß Muchacho |
Re: Anzahl Datensätze einer Tabelle beschränken
So, jetzt erst nochmal guten Abend oder besser gute Nacht von mir,
habe es leider länger nicht geschaft mich mit dem Thema auseinander zu setzt, jedoch habe ich Zwischendurch immer mal Eure Kommenetare gelesen. Dafür erstemal besten Dank. Einfach vieleicht nochmal kurz eine Erläuterung von mir zu diesem Thema, ich persönlich finde den Weg mit der ID und das Problem in der DB zu lösen ist für meine Anwendung schon ganz OK. Ich will mit dem Beschränken der Datensätze eigendlich ein Lizenztechnischen Problem lösen. Meine Software ist in verschiedenen Varianten erhältlich. Je nach Kundenbedarf und Funktionsinhalt kann der Kunde auch die Größe vom Ringspeicher wählen. Dies bedeutet zwar keine Kostenerhöung für den Kunden, sondern lediglich eine Möglichkeit die Datenmenge einzuschränken. Man kann beim Projektieren der Alarmanlage, welche diese Ereignisse zur Vefügung stellt, die ungefähre Datenmenge vorab schon ermitteln. Verbindet man jetzt das Interesse des Kunden an den Daten mit dem Datenaufkommen, kann man ohne großen Aufwand die Sinnvolle Größe des Ringspeichers festlegen und hat in der Zukunft keinerlei Probleme, das der Kunden unötige Datenbanken hat, die er gar nicht mehr sehen will. Vieleicht hat das ja noch zur Erläuterung geholfen. Ansonsten schon mal recht vielen dank für Eure Antworten. MFG Gruß Jens |
Re: Anzahl Datensätze einer Tabelle beschränken
Hallo zusammen,
So, ich habe das Problem jetzt gelößt. Der Vorschlag von... Zitat:
Hier mal der fertige Trigger.
SQL-Code:
Danke mal wieder für die Hilfe.
AS
begin if (new.ID is null) then new.ID = gen_id(GEN_MB256PLUS_ID, 1); if (new.id > 630000) then delete from mb256plus where id=new.id-630000; end Gruß Jens [edit=mkinzler]Code-Tag durch Sql-Tag ersetzt Mfg, mkinzler[/edit] |
Re: Anzahl Datensätze einer Tabelle beschränken
Hallo Jens,
aber ID wächst ja dann immer an, oder? Würde auch bedeuten, dass er dann immer das DELETE ausführt, allerdings wird er dann ab einer bestimmten ID nichts mehr löschen, weil es die "kleinen" IDs nicht mehr gibt. Außer ich habe auf die Schnelle was übersehen. :-D |
Re: Anzahl Datensätze einer Tabelle beschränken
Da hast du leider was übersehen.
ID ist eine PK und wird immer hoch gezählt soll heißen...
Code:
wenn PK_ID größer 630000 dann lösche PK_ID NEU - 630000 also PK_ID 1 wenn PK_ID NEU 630301
if (new.id > 630000) then delete from mb256plus where id=new.id-630000;
wenn PK_ID größer 630000 dann lösche PK_ID NEU - 630000 also PK_ID 2 wenn PK_ID NEU 630302 usw... funktioniert auch genau so. PK_ID wird ja trotzallem immer weiter geführt. Gruß Jens |
Re: Anzahl Datensätze einer Tabelle beschränken
Hallo Jens,
da haste Rechte. :-D Den Generatorwert darf halt dann niemand zurücksetzen. |
Re: Anzahl Datensätze einer Tabelle beschränken
Richtig.
Da aber niemand Zugriff auf den Generator hat, geht das. Sicherlich gebe ich dir Recht das es möglich wäre. Aber dann würde ich das als Maniplulation bezeichnen. Gruß Jens |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz