Archiv verlassen und diese Seite im Standarddesign anzeigen : MySQL : Datenbank Konsistent halten
DanDanger
06-09-2003, 21:07
Hallo,
ich hab' ein kleines Problem mit meiner MySQLDatenbank :
Jeder Eintrag im meiner Tabelle bekommt Automatisch einen ID-Wert
zugewiesen :
`ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY
Die Tabelle sieht daher ungefähr so aus :
ID Value
===================
1 Wert_1
2 Wert_2
3 Wert_3
...
Mein Problem ist nun, das nach einer Löschaktion (z.B. nach dem Löschen vom Datensatz mit dem Wert 2)
die ganze Tabelle nicht meht konsistent ist :
ID Value
===================
1 Wert_1
3 Wert_3
...
Ich bin aber auf eine Durchgehende ("Lückenlose") Nummerierung der Felder angewiesen.
Nach dem Löschen vom 2. Datensatz SOLLTE die Tabelle also so aussehen :
ID Value
===================
1 Wert_1
2 Wert_3
...
Meine Frage : Wie kriege ich das hin ????
Gibt es eine Möglichkeit , ohne die Tabelle nach jeder Löschaktion neu zu Durchlaufen, um die ID-Werte zuzuweisen ?
Neugierige Grüsse
DanDanger
quinte17
06-09-2003, 21:46
ich schätze da musst du selbst hand anlegen... ein script schreiben oder so... weil trigger kann die mysql glaub ich noch nicht... ich weiß auch nicht ob sie etwas ähnliches hat
mfg
(sorry für die schlechte hilfe)
erweitere Deine Tabelle einfach um ein Statusfeld. Beim Löschen löscht Du dann nicht sondern änderst nur das Statusfeld...
DanDanger
09-09-2003, 15:34
@elrond : Danke, so ähnlich habe ich es auch gemacht.
Das Problem ist nur : ich muss nach jeder Löschoperation
die Komplette Datenbank hinter dem gelöschten Objekt Durchlaufen und
die ID-Nummern neu zuweisen, was bei grossen Datenmengen schon etwas dauert.
Christoph
09-09-2003, 16:05
Mit MySQL geht das zwar nicht, aber wenn andere Datenbanken für Dich eine Option sind, dann kannst Du es z.B. mit Postgres (sollte auch mit Interbase/Firebird gehen) durch Foreign Key Constraints mit dem Zusatz ON DELETE CASCADE oder ON DELETE SET NULL machen.
Handgebastelte Lösungen gehen in komplexeren Situationen mit Wahrscheinlichkeit Eins irgendwann schief.
@DanDanger
wozu ist diese fortlaufende ID denn gut?
Ich meinte nicht Löschen sondern ein Update auf den Status, damit bleibt der Datensatz und deine fortlaufende ID erhalten...
Handgebastelte Lösungen gehen in komplexeren Situationen mit Wahrscheinlichkeit Eins irgendwann schief.
@Christoph
ich halte diese Aussage für groben Unfug :eek: Versuch das Wort "Bastelei" gegen "Entwicklung" zu tauschen und sieh dir das Ganze dann nochmals an...
Ich bin mit der "Batelei" jedenfalls einigermaßen erfolgreich ;)
Hallo,
ich habe da mal ein paar Verständisfragen:
Was für eine Anwendung schreibst du?
Denn in meiner ganzen Ignoranz würde ich behaupten, daß die Datenbank trotz Löschen völlig konsistent bleibt. Na ja, egal...
Ich würde dir dringend raten, entweder die Nummerierung entweder in Software zu machen (alles aus der DB holen und dann nach Gefallen durchnummerieren) oder ein anderes Datenschema zu benutzen:
<kurz überleg>
Mach es in Software... Oder liege ich damit falsch?
mir fällt auch kein anwendungsfall für eine zwingend benötigte durchfgehende Nummerierung ein...:confused:
ggf. Rechnungsnummern oä. aber diese werden eben nicht gelöscht sondern storniert...
Moin,
mir würden zwar schon Anwendungen einfallen. Aber die würden nicht in einer Datenbank gespeichert werden.
Ich habe das Gefühl, er braucht eigentlich eine verkettete Liste, bei der die Position in der Liste wichtig ist. Meinetwegen irgendwelche Puffer, oder so. Das mit einer Datenbank zu realisieren halte ich für unklug...
Na ja, ich bin auf jeden Fall gespannt, was es denn nun wirklich ist...
DanDanger
10-09-2003, 23:14
Hallo,
es handelt sich eigentlich "nur" um eine Art Warenverwaltung.
Die Position in der Liste (also die "ID-Nummern" ) Stellen eine Art "Ranking" dar.
Nach dem Löschen eines Datensatzes sollen alle anderen "einen Platz höher" in der Liste rutschen.
Ich hielt daher eine "Durchnummerierung" für eine recht gute Idee...:P
Gruss
DanDanger
Moin,
wenn du eine Reihenfolge in den Datensätzen anlegen willst, nimm dafür ein eigenes Feld. Dann muß aber klar sein, daß bei jedem Löschen alle Werte neu gesetzt werden müssen.
Wenn du also die Positionen 1-5 hast und Nr. 3 löscht, dann müssen entsprechend 4,5 angepaßt werden.
Die ID, die du dafür verwendest, ist (der Name deutet es an) zur eindeutigen Identifikation des Datensatzes. Solange dieser besteht sollte sie sich (logisch betrachtet) nicht ändern. Deine Personalausweisnummer wird sich ja auch nicht ändern...
Was du natürlich für ein Ranking machen kannst, ist folgendes:
1. Du führst ein neues Attribut "position" ein, das aussagt, an welcher Stelle die Ware stehen soll
2. Wenn du Elemente löscht, änderst du nichts
3. Wenn du die Waren ausliest, muß deine Software die Lücken in der Reihenfolge verdecken und ggf. die Datenbankeinträge anpassen
oder: beim Löschen änderst du jeweils das Attribut "position"
Das wären so meine Ideen. Je nach Anwendungsart ist vielleicht die eine oder die andere besser. Vielleicht auch keine, muß du wissen...
wenn du ein ranking brauchst kannst du folgendes tun:
jeder Datensatz erhät ein integer-Feld, das immer wenn du es für nötig hälst hochgezählt wird (z.B. bei jeder Anforderung)
bei der ausgabe kannst du deine Datenbank einfach danach sortieren lassen "...order by counter desc"
DanDanger
11-09-2003, 09:05
Danke für die Antworten.
wenn du eine Reihenfolge in den Datensätzen anlegen willst, nimm dafür ein eigenes Feld. Dann muß aber klar sein, daß bei jedem Löschen alle Werte neu gesetzt werden müssen.
Wenn du also die Positionen 1-5 hast und Nr. 3 löscht, dann müssen entsprechend 4,5 angepaßt werden.
So hab ich's auch gemacht (funzt eigentlich ganz gut).
Das ganze kann nur bei grossen Datenmengen recht lange dauern
(z.B. 1.000.000 Datensätze, und Nummer 2 wird gelöscht),
daher dachte ich, das MySQL vieleicht so eine Funktion schon
(auf Geschw. Optimiert) Implementiert hat.
Gruss
DanDanger
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.