Primärschlüssel bei neuen Eintrag

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Primärschlüssel bei neuen Eintrag

    Hallo miteinander.

    Mir stellt sich eine Frage und ich finde keine Antwort darauf. Ich versuch euch das einmal zu schildern, vielleicht könnt ihr mir da ja weiterhelfen:

    Ich habe zwei Tabellen die folgendermaßen aufgebaut sind:
    Kunde: K_ID, K_Name, AN_ID(FK), K_Tel, ...
    Anschrift: AN_ID, AN_Straße, AN_HausNr, ...
    Jetzt möchte ich über ein Formular (per PHP) einen kompletten Kunden hinzufügen, d.h. Name, Telefonnummer, Straße, Hausnummer usw.
    Mir ist auch soweit noch klar, dass ich zuerst die Daten der Anschrift in die Tabelle Anschrift eintragen muss und anschließend erst die restlichen Daten in die Kundentabelle. Jedoch wenn ich die Daten der Anschrift eintrage, lasse ich die AN_ID automatisch vergeben (mySQL). Und darin liegt jetzt mein Problem.
    Wie komme ich an die AN_ID ran, damit ich diese in die Kundentabelle eintragen kann? Sonst stehen die Daten ja nicht in Beziehung miteinander.

    Hoffe ich konnte euch die Situation verständlich genug erklären :)
    ~ rock on ~
  • Nein. 1:1 macht ja keinen Sinn. Ist schon eine 1:N. Es gibt noch eine weitere Tabelle in der auch Anschriften benötigt werden. Zum größten Teil auch die selben. Deshalb habe ich die Anschriften in eine extra Tabelle dafür angelegt.

    Wie kann ich denn jetzt einen Kunden auf einen rutsch komplett eintragen? Also Kundendaten und die Anschrift, so das ich die AN_ID aus der Anschriftentabelle beim eintragen bekomme und anschließend als Fremdschlüssel in die Kundentabelle mit übernehmen kann?
    ~ rock on ~
  • Ok, das macht natürlich Sinn. Zwischen Kunde und Anschrift ist es dann formel dennoch 1:1 :P
    Dann benötigst du die Funktion LAST_INSERT_ID()
    Gibt den ersten automatisch erzeugten Wert zurück, der für eine AUTO_INCREMENT-Spalte durch die aktuelle INSERT- oder UPDATE-Anweisung eingestellt wurde, die eine solche Spalte modifiziert hat.

    Nutze am besten InnoDB und pack es in eine Transaktion.
  • Danke für die Antwort. Hab aber noch ein kleines Verständnisproblem, wie ich alles in eine Abfrage bekommen. Derzeit sieht es so aus (php):

    Quellcode

    1. $sql="INSERT INTO Anschrift
    2. (AN_Straße, AN_HausNr, AN_PLZ, AN_Ort)
    3. VALUES ('".$_POST['AN_Straße']."', '".$_POST['AN_HausNr']."', '".$_POST['AN_PLZ']."', '".$_POST['AN_Ort']."')
    4. SELECT LAST_INSERT_ID()";
    5. $AN_ID=mysql_query($sql) or die(mysql_error());

    Irgendwo hab ich aber noch einen Fehler. Ich seh in nur nicht :(
    ~ rock on ~
  • man kann keine zwei Aktionen in einem Query machen.
    Also entweder du machst sie einzeln - so wie du es wahrscheinlich kennst über PHP.
    Oder du musst InnoDB (bzw. Berkeley DB) als Storage Engine verwenden und die Queries dann in eine Transaktion packen.

    Quellcode

    1. BEGIN;
    2. INSERT...
    3. SELECT...
    4. INSERT...
    5. COMMIT;


    Zum Thema Transaktionen findest du in der Wikipedia Informationen:
    • [wikipedia]http://de.wikipedia.org/wiki/Transaktion_(Informatik)[/wikipedia]
    • [wikipedia]http://de.wikipedia.org/wiki/ACID_(Informatik)[/wikipedia]
  • So. Hab jetzt einmal ein bißchen rumprobiert.

    Einzeln das ganze zu machen ist ein Fehlschlag. Da wird mir als Wert immer 0 zurückgegeben. Es muss also auf einmal gehen!
    Nun habe ich folgenden Code und bekomme dafür eine Fehlermeldung.

    Quellcode

    1. $sql="BEGIN
    2. INSERT INTO Anschrift
    3. (AN_Straße, AN_HausNr, AN_PLZ, AN_Ort)
    4. VALUES ('".$_POST['AN_Straße']."', '".$_POST['AN_HausNr']."', '".$_POST['AN_PLZ']."', '".$_POST['AN_Ort']."')
    5. SELECT LAST_INSERT_ID()
    6. COMMIT";
    7. $AN_ID=mysql_query($sql) or die(mysql_error());

    Quellcode

    1. You have an error in your SQL syntax;
    2. check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO Anschrift (AN_Straße, AN_Ha


    Kann ich überhaupt bei PHP ein InnoDB verwenden?
    Hoffe ihr könnt mir weiterhelfen :)
    ~ rock on ~