BloodySword: MySQL Anfängerfragen

Hallo,

ich bin ganz frisch in der MySQL-Programmierung eingestiegen. Bisher bin ich dem immer aus dem Weg gegangen. Aber leider ist das das A und O in der dynamischen Webseitenprogrammierung.

Frage 1:

Wie kann ich es schaffen, dass wenn man Beziehungen zwischen Tabellen erstellt, dass diese sich auch automatisch löschen?

Beispiel:

Ich habe eine Tabelle namens Users
Dort werden die Benutzerdaten wie Passwort gespeichert.
Dann habe ich eine Tabelle namens "Authorizations" wo Rechte für Benutzer gespeichert sind.
In dieser sieht es in etwa so aus:

ID (Primary Key)
USERID (Verbunden mit ID aus der Tabelle User)
AUTHORISATION_TYPE (INT - Verbunden mit einer anderen Tabelle mit verschiedenen Authorisationen)
PERMISSUION (BOOL)

Wenn sich jetzt ein Benutzer löscht, sollen automatisch auch alle Einträge in der Authorizations-Tabelle, die den Benutzer betreffen gelöscht werden.

Wie stelle ich das an?

Frage 2:

Wenn man sich mit einer MySQL-Datenbank verbunden hat und fertig ist in dem Script, muss die Verbindung dann explizit im Script getrennt werden oder macht der MySQL-Treiber das automatisch sobald das Script abgearbeitet wurde?

Vielen Dank im Vorraus.

lg BloodySword

  1. Hallo!

    Wenn sich jetzt ein Benutzer löscht, sollen automatisch auch alle Einträge in der Authorizations-Tabelle, die den Benutzer betreffen gelöscht werden.

    Wie stelle ich das an?

    DELETE users, authorisations FROM users, authorisations WHERE id = ....
    oder

    1. DELETE FROM users WHERE id=...
    2. DELETE FROM authorisations WHERE id=...

    siehe auch: http://dev.mysql.com/doc/refman/5.1/de/delete.html

    Frage 2:

    Wenn man sich mit einer MySQL-Datenbank verbunden hat und fertig ist in dem Script, muss die Verbindung dann explizit im Script getrennt werden oder macht der MySQL-Treiber das automatisch sobald das Script abgearbeitet wurde?

    Die Frage stellt sich nicht, da es allein ein sauberer Programmierstil erfordert, dass Du die Verbindung ordnunggemäß schließt!

    Vielen Dank im Vorraus.

    lg BloodySword

    Gruß, Markus **

    1. Hello,

      siehe auch: http://dev.mysql.com/doc/refman/5.1/de/delete.html

      oder eine Datenbank vom Typ InnoDB verwenden, kombiniert mit einem definierten FOREIGN-KEY-Constraint und der Anweisung ON DELETE CASCADE.

      MfG
      Rouven

      --
      -------------------
      sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
      Death is nature's way of telling you to slow down.
      1. oder eine Datenbank vom Typ InnoDB verwenden, kombiniert mit einem definierten FOREIGN-KEY-Constraint und der Anweisung ON DELETE CASCADE.

        Das gefällt mir schon eher. Ist das dann Serveraufwendiger als wenn ich das manuell im PHP als SQL-Abfrage mache wie dein Vorgänger es vorschlug?

        1. echo $begrüßung;

          oder eine Datenbank vom Typ InnoDB verwenden, kombiniert mit einem definierten FOREIGN-KEY-Constraint und der Anweisung ON DELETE CASCADE.
          Das gefällt mir schon eher. Ist das dann Serveraufwendiger als wenn ich das manuell im PHP als SQL-Abfrage mache wie dein Vorgänger es vorschlug?

          InnoDB hat nicht nur Vorteile. Ein bedeutender Aspekt ist ihre eventuelle Nichtzurverfügungstellung seitens des Hosters.

          Das nächste Problem ist die Atomarität. Wenn du (ohne InnoDB) Löschungen auf mehrere Statements verteilst und es geht dabei etwas schief, was passiert dann mit den restlichen Statements? Ist sichergestellt, dass sie trotzdem ausgeführt werden oder bleibt in dem Fall Datenmüll zurück?

          Außerdem gibt es Trigger, die man auch ohne InnoDB verwenden kann. Und auch Stored Procedures sind mittlerweile vorhanden, so dass ein komplexer Löschvorgang darin gekapselt werden kann. Beide Features setzen MySQL ab Version 5 voraus.

          echo "$verabschiedung $name";

          1. echo $begrüßung;

            oder eine Datenbank vom Typ InnoDB verwenden, kombiniert mit einem definierten FOREIGN-KEY-Constraint und der Anweisung ON DELETE CASCADE.
            Das gefällt mir schon eher. Ist das dann Serveraufwendiger als wenn ich das manuell im PHP als SQL-Abfrage mache wie dein Vorgänger es vorschlug?

            InnoDB hat nicht nur Vorteile. Ein bedeutender Aspekt ist ihre eventuelle Nichtzurverfügungstellung seitens des Hosters.

            Das nächste Problem ist die Atomarität. Wenn du (ohne InnoDB) Löschungen auf mehrere Statements verteilst und es geht dabei etwas schief, was passiert dann mit den restlichen Statements? Ist sichergestellt, dass sie trotzdem ausgeführt werden oder bleibt in dem Fall Datenmüll zurück?

            Außerdem gibt es Trigger, die man auch ohne InnoDB verwenden kann. Und auch Stored Procedures sind mittlerweile vorhanden, so dass ein komplexer Löschvorgang darin gekapselt werden kann. Beide Features setzen MySQL ab Version 5 voraus.

            echo "$verabschiedung $name";

            Also wäre InnoDB eine Lösung.

            Wenn ich mich für InnoDB entscheide:
            Wie genau baue ich mit den SQL-Befehlen die Verbindungen auf + Lösung?

            Ein Einfaches Beispiel wäre nett, dann muss ich mich nicht durch zig Zeilen Grundlagenerklärung kämpfen bevor ich lesen kann wie's geht ^^.

            Dazu kommt, dass ich zusammen mit einem Kumpel gerade eine Website bastele. Wenn ich Änderungen an meiner DB vornehme, kann ich diese exportieren damit er diese auch hat. Problem ist aber, dass PHPMyAdmin 3.1.1 die Beziehungen (im Designer erstellt) nicht exportiert. Auch das Kopieren der Datenbank vom XAMPP (den Ordner) brachte nichts. Ich muss immer das ganze XAMPP zu ihm schicken damit diese bleiben.

            Wenn ich die Verbindungen später per SQL-Befehle eintrage, entfällt das Exportieren der Beziehungen sowieso. Ich schreibe diese in eine SQL-Datei und schreibe als Kommentare immer mit Datum und Uhrzeit die Änderungen hin. So weiß man welche Beziehungsbefehle ausgeführt werden müssen, damit er auf den neusten Stand ist.

            lg BloodySword

    2. DELETE users, authorisations FROM users, authorisations WHERE id = ....
      oder

      1. DELETE FROM users WHERE id=...
      2. DELETE FROM authorisations WHERE id=...

      siehe auch: http://dev.mysql.com/doc/refman/5.1/de/delete.html

      Dankesehr ich werde mich da mal einarbeiten und mir ein Script.

      Die Frage stellt sich nicht, da es allein ein sauberer Programmierstil erfordert, dass Du die Verbindung ordnunggemäß schließt!

      In einem anderen Forum sagt man mir, ich brauche das nicht, da das vom SQL-Treiber am Scriptende automatisch vorgenommen werden würde. O_O.

  2. Hi,

    ich bin ganz frisch in der MySQL-Programmierung eingestiegen. [...]
    Wie stelle ich das an?

    zum Thema hast du ja schon ein paar Hinweise bekommen.
    Was mich noch beschäftigt: Warum postest du eine reinrassige MySQL-Frage in der Rubrik "PHP" und nicht in "DATENBANK"?

    Vielen Dank im Vorraus.

    Ein 'r' darfst du behalten.

    So long,
     Martin

    --
    There are 10 types of people in the world: Those who understand the binary system, and those who don't.