Anzeige:
Ergebnis 1 bis 13 von 13

Thema: MySQL : Datenbank Konsistent halten

  1. #1
    Registrierter Benutzer Avatar von DanDanger
    Registriert seit
    15.12.2001
    Ort
    /home/dandanger
    Beiträge
    130

    MySQL : Datenbank Konsistent halten

    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 :
    Code:
    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 :
    Code:
    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 :
    Code:
    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
    ------------------------------------
    DanDanger

  2. #2
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    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)

  3. #3
    Registrierter Benutzer Avatar von elrond
    Registriert seit
    03.10.2001
    Ort
    potsdam
    Beiträge
    881
    erweitere Deine Tabelle einfach um ein Statusfeld. Beim Löschen löscht Du dann nicht sondern änderst nur das Statusfeld...
    "Um die Welt zu ruinieren, genügt es, wenn jeder seine Pflicht tut." (Winston Churchill)

  4. #4
    Registrierter Benutzer Avatar von DanDanger
    Registriert seit
    15.12.2001
    Ort
    /home/dandanger
    Beiträge
    130
    @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.
    ------------------------------------
    DanDanger

  5. #5
    Registrierter Benutzer
    Registriert seit
    21.06.1999
    Beiträge
    677
    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.

  6. #6
    Registrierter Benutzer Avatar von elrond
    Registriert seit
    03.10.2001
    Ort
    potsdam
    Beiträge
    881
    @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 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
    "Um die Welt zu ruinieren, genügt es, wenn jeder seine Pflicht tut." (Winston Churchill)

  7. #7
    Registrierter Benutzer
    Registriert seit
    01.08.2001
    Beiträge
    57
    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?

  8. #8
    Registrierter Benutzer Avatar von elrond
    Registriert seit
    03.10.2001
    Ort
    potsdam
    Beiträge
    881
    mir fällt auch kein anwendungsfall für eine zwingend benötigte durchfgehende Nummerierung ein...

    ggf. Rechnungsnummern oä. aber diese werden eben nicht gelöscht sondern storniert...
    "Um die Welt zu ruinieren, genügt es, wenn jeder seine Pflicht tut." (Winston Churchill)

  9. #9
    Registrierter Benutzer
    Registriert seit
    01.08.2001
    Beiträge
    57
    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...

  10. #10
    Registrierter Benutzer Avatar von DanDanger
    Registriert seit
    15.12.2001
    Ort
    /home/dandanger
    Beiträge
    130
    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
    ------------------------------------
    DanDanger

  11. #11
    Registrierter Benutzer
    Registriert seit
    01.08.2001
    Beiträge
    57
    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...

  12. #12
    Registrierter Benutzer Avatar von elrond
    Registriert seit
    03.10.2001
    Ort
    potsdam
    Beiträge
    881
    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"
    "Um die Welt zu ruinieren, genügt es, wenn jeder seine Pflicht tut." (Winston Churchill)

  13. #13
    Registrierter Benutzer Avatar von DanDanger
    Registriert seit
    15.12.2001
    Ort
    /home/dandanger
    Beiträge
    130
    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
    ------------------------------------
    DanDanger

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •