Gelöschte ID's herausfiltern
Alltimefriend
- datenbank
0 Cheatah0 Alltimefriend0 Thomas W.0 Cheatah0 Alltimefriend0 Cheatah0 Klaus Mock
Hallo Leute!
Wie kann ich am besten aus einer DB mittels SQL gelöschte Einträge erkennen?
Ich lasse automatisch eine auto-increment-ID mitlaufen, d.h. wenn ich etwas lösche, entsteht da natürlich ein "Loch". Wie kann ich das am besten abprüfen?
Es ist so, dass wir in der Firma 2 Datenbanken haben. Zum einen die interne Software, die über Access läuft, und dann die Homepage die über MySQL läuft. Zwischen diesen 2 DBs gibt es einen Abgleich. Updates in der Access werden in der Nacht auch auf dem MySQL ausgeführt.
Ein Problem hab ich nun eben, wenn in der Access-DB - aus welchem Grund auch immer - Einträge gelöscht werden. Der Chef meinte eben, es ginge am besten mit dem Aufspüren der Lücken bei den IDs, diese in einem Text-File abzuspeichern und dann der Reihe nach die entsprechenden MySQL-Einträge zu löschen.
Letzteres ist kein Problem, nur habe ich eben ein Organisations-Problem mit dem ersten Teil.
Hoffe, dass mir hier jemand weiterhelfen kann.
lg, ATF
Hi,
Ich lasse automatisch eine auto-increment-ID mitlaufen, d.h. wenn ich etwas lösche, entsteht da natürlich ein "Loch". Wie kann ich das am besten abprüfen?
bitte nicht schon wieder :-( Die ID-Spalte hat *kein* "Loch", denn die einzelnen Werte haben *keine* Bedeutung. Sie sind völlig willkürlich[1] und haben *exakt* eine Aufgabe: den Datensatz eindeutig zu identifizieren. Jeder Versuch, die Werte für irgend etwas anderes zu missbrauchen, ist zum Scheitern verurteilt.
Siehe *bitte* </archiv/>. Das nächste Mal _vor_ der Frage.
Cheatah
[1] Die Tatsache, dass die IDs zunächst fortlaufend gewählt werden, entspringt lediglich der Einfachheit eines entsprechenden Algorithmus'.
Hallo!
bitte nicht schon wieder :-( Die ID-Spalte hat *kein* "Loch", denn die einzelnen Werte haben *keine* Bedeutung. Sie sind völlig willkürlich[1] und haben *exakt* eine Aufgabe: den Datensatz eindeutig zu identifizieren. Jeder Versuch, die Werte für irgend etwas anderes zu missbrauchen, ist zum Scheitern verurteilt.
Ich glaube Du verstehst mich falsch. Ich mache ja selbst nichts an der ID-Spalte, es ist mir bewusst, dass dies "nur" zur eindeutigen Identifizierung dient.
Nur, wenn ich zB 10 Einträge habe, habe ich in der Liste schön die Reihe 1,2,3,4,.....,9,10 - Als Beispiel, ok?
Lösche ich zB die Einträge mit den IDs 3 und 7, habe ich in der Reihenfolge (nur optisch!) ein "Loch", da nun IDs fehlen.
Die Liste würde dann eben so aussehen:
1,2,4,5,6,8,9,10
Und meine Frage ist es eben, wie ich das am besten erkennen kann, dass Einträge (bzw. IDs) gelöscht wurden.
Die MySQL-DB ist nämlich so aufgebaut, dass ich neben dem eigenen ID-Feld, auch ein Feld für die Access-ID habe, und anhand dieser ich die Einträge erkennen und dann auch löschen könnte.
lg, ATF
Hallo,
Und meine Frage ist es eben, wie ich das am besten erkennen kann, dass Einträge (bzw. IDs) gelöscht wurden.
Hmm, gar nicht (Du bist jetzt auf der Access-DB). Da Loeschungen nur auf der A-DB durchgefuehrt werden und die MySQL die nur spiegeln soll, wuerde ich mir einfach eine Liste der aktuellen A-DB-Ids nehmen, und alles auf der M-DB loeschen, was eine A-Id hat, die nicht in dieser Liste ist.
Gruss
Thomas
Hallo Thomas!
Hmm, gar nicht (Du bist jetzt auf der Access-DB). Da Loeschungen nur auf der A-DB durchgefuehrt werden und die MySQL die nur spiegeln soll, wuerde ich mir einfach eine Liste der aktuellen A-DB-Ids nehmen, und alles auf der M-DB loeschen, was eine A-Id hat, die nicht in dieser Liste ist.
Diese Idee hatte ich auch schon, jedoch gibt es zum Teil Tables mit zig Tausend Einträgen (zB hat eine 18500 und eine andere über 30000 Einträge).
Ein SQL mit "WHERE A_ID != 3 AND ....." wäre hier etwas zu lang, meinst nicht auch? *ggg*
Hatte schon die Idee, mir alle IDs in einem Array (oder als String mit ";" getrennt zu speichern), und dann die höchste ID herzuholen und 1 bis höchste ID ebenso abzuspeichern, und diese dann zu vergleichen. So könnte ich dann nämlich genau die gelöschten rausfiltern, weil diese Anzahl deutlich kleiner als die der bestehenden Einträge ist.
Muss das nur noch irgendwie ordnen *ggg*
lg, ATF
Hallo,
Diese Idee hatte ich auch schon, jedoch gibt es zum Teil Tables mit zig Tausend Einträgen (zB hat eine 18500 und eine andere über 30000 Einträge).
Ein SQL mit "WHERE A_ID != 3 AND ....." wäre hier etwas zu lang, meinst nicht auch? *ggg*
Nein, so macht man das ja auch nicht. Du selektierst auf der MySQL alles, was eine ID hat, die auch in der A-DB steht. Diese Auswahl steckst Du in eine temporaere Tabelle. Dann loeschst Du die urspruengliche Tabelle und gibst der temporaeren Tabelle den Namen der urspruenglichen Tabelle.
Gruss
Thomas
Hi,
Lösche ich zB die Einträge mit den IDs 3 und 7, habe ich in der Reihenfolge (nur optisch!) ein "Loch", da nun IDs fehlen.
bei IDs existiert keine "Optik". Und schon gar kein "Loch".
Und meine Frage ist es eben, wie ich das am besten erkennen kann, dass Einträge (bzw. IDs) gelöscht wurden.
Indem Du irgendwo hinreichende Informationen über die Löschung abspeicherst. Es existiert kein Weg, zwischen der Löschung eines Datensatzes einer bestimmten ID und dem Fehlen desselben aus anderen Gründen zu unterscheiden. Der explizite Wert der ID-Spalte hat *keine*, wirklich *absolut gar keine* Bedeutung über die Identifizierung eines Datensatzes hinaus; er sagt auch nichts darüber aus, ob ein Datensatz mal existiert haben könnte.
Cheatah
Hallo
Indem Du irgendwo hinreichende Informationen über die Löschung abspeicherst.
Das war zuerst mein Vorschlag. Doch kann ich an dieser internen Software nicht selbst Hand anlegen, da es ein Produkt eines Drittanbieters ist und sicher dieser (aus welchen Gründen auch immer) weigert, Löschungen zu protokollieren.
Bräuchte dann ja nur ein kleines File mit einer Liste der gelöschten IDs und könnte diese dann abklappern, aber wie gesagt, es ist keine Kooperation da ;o(
lg, ATF
Hi,
Bräuchte dann ja nur ein kleines File mit einer Liste der gelöschten IDs
wie oft denn noch? *Die* *erhälst* *Du* *nicht!* Das Maximum des Denkbaren ist eine Liste der _fehlenden_ IDs, was aber bar jeder Aussagekraft ist.
Cheatah
Hallo,
Bräuchte dann ja nur ein kleines File mit einer Liste der gelöschten IDs und könnte diese dann abklappern, aber wie gesagt, es ist keine Kooperation da ;o(
Um halbwegs verläßlich zu solch einer Liste zu kommen, müsstest Du alle Id-Werte aus der Access-Datenbank mit allen korrespondierenden Werten aus der mySQL-Datenbank abgleichen. ID-Werte, die nur in der mySQL-Datenbank vorkommen, sollten dann die ID-Werte der gelöschten Access-Datensätze repräsentieren. Fehlen würden nur ID's von Datensätzen, die noch nie zuvor in die mySQL-Datenbank übertragen wurden. Aber die sind Dir, so denke ich, sowieso egal.
Grüße
Klaus