2 Tabellen verknüpft, wie garantiere ich gleiche IDs?

Dieses Thema im Forum "Datenbanksysteme für das Web" wurde erstellt von Jakob, 22.02.2005.

  1. Jakob

    Jakob Thread Starter MacUser Mitglied

    Beiträge:
    1.067
    Zustimmungen:
    21
    MacUser seit:
    05.01.2004
    Hallo,

    aus einem Kontaktformular sollen alle bis auf eine Info + durchgehende ID in eine Tabelle, eine Info + ID in die andere Tabelle.

    Wie garantiere ich gleiche IDs in beiden Tabellen? Wenn er aus irgendnem Grund mal nicht in eine Tabelle schreiben konnte, also da ne ID fehlt, sind ja alle folgenden verschoben, oder?
     
  2. lindic

    lindic MacUser Mitglied

    Beiträge:
    197
    Zustimmungen:
    5
    MacUser seit:
    20.11.2004
    Hallo!

    Ich würde erst die Daten in die erste Tabelle eintragen, die ID rausholen und diese ID mit den anderen Daten dann in die zweite Tabelle eintragen.

    Wenn die IDs mit auto_increment eingetragen werden, muss natürlich bei der zweiten Tabelle diese Funktion abgeschalten werden.
     
  3. Jakob

    Jakob Thread Starter MacUser Mitglied

    Beiträge:
    1.067
    Zustimmungen:
    21
    MacUser seit:
    05.01.2004
    Gute Idee... wie würdest Du das Syntaxmäßig machen? Kann ich gleich in der nächsten Zeile auf einen Wert zurückgreifen, der vielleicht vor ner halben sekunde geschrieben wurde?
     
  4. Agmemon

    Agmemon MacUser Mitglied

    Beiträge:
    172
    Zustimmungen:
    0
    MacUser seit:
    05.11.2003
    Um auf solche Situationen zu reagieren, setzt man Transaktionen ein, die sicherstellen, das alle Aktionen (in deinem Fall das Schreiben in beide Tabellen) entweder vollständig oder gar nicht durchgeführt werden.

    Ansonsten ist der Tipp von Lindic natürlich richtig, da man in zwei Tabellen auch mit Transaktionen nicht sicherstellen kann, dass die automatischen IDs immer gleich sind, zumindest bei MySQL. Unter Oracle läßt sich das über den Einsatz von Sequenzen machen.
     
  5. lindic

    lindic MacUser Mitglied

    Beiträge:
    197
    Zustimmungen:
    5
    MacUser seit:
    20.11.2004
    Nach dem ersten INSERT-Befehl kannst du mit
    PHP:
    $id mysql_insert_id();
    die soeben eingetragene ID ermitteln und für das zweite INSERT verwenden.
     
  6. Nogger

    Nogger MacUser Mitglied

    Beiträge:
    367
    Zustimmungen:
    0
    MacUser seit:
    03.08.2004
    Es ist aber auch von der Konzeption falsch, den Fremdschlüssel auf die ID in der Tabelle 1 in Tabelle 2 als auto_increment zu führen.
     
  7. lindic

    lindic MacUser Mitglied

    Beiträge:
    197
    Zustimmungen:
    5
    MacUser seit:
    20.11.2004
    Ich hatte das so gemeint:

    Tabelle 1: ID -> auto_increment

    Tabelle 2: ID -> NICHT auto_increment, sondern Bezug zur ID von Tabelle 1
     
  8. master_p

    master_p MacUser Mitglied

    Beiträge:
    1.065
    Zustimmungen:
    23
    MacUser seit:
    31.01.2005
    Ich hätte es so gemacht:
    Tabelle #1:
    Tabelle1.ID (auto_increment) | Tabelle1.Feld1 | Tabelle1.Feld2...

    Tabelle #2:
    Tabelle2.ID (auto_increment) | Tabelle2.Feld1 | Tabelle2.Feld2...

    Tabelle #3:
    Tabelle3.ID (auto_increment) | Tabelle1.ID | Tabelle2.ID

    Die einzelnen Werte kann man dann in die Tabellen eintragen und am Ende den Datensatz für Tabelle #3 erstellen. Um die beiden Sachen wieder zu "vereinen" nimmt man dann einfach ganz easy den LEFT JOIN. An den IDs würde ich generell nicht herumspielen, das birgt nur Ärger, wenn jemand mal an den Daten fummelt und wenn eine gelöscht wird, stimmt der auto_increment schon nicht mehr etc. Nee das gehört verboten ;-)
     
  9. Nogger

    Nogger MacUser Mitglied

    Beiträge:
    367
    Zustimmungen:
    0
    MacUser seit:
    03.08.2004
    Die dritte Tabelle ist nur bei n:m Beziehungen nötig. Der Beschreibung nach ist es eine 1:n oder 1:1 Beziehung, und da reicht ein Fremdschlüsselattribut.
     
  10. Jakob

    Jakob Thread Starter MacUser Mitglied

    Beiträge:
    1.067
    Zustimmungen:
    21
    MacUser seit:
    05.01.2004
    Wird Zeit die Waffen offen auszulegen: Also in dem speziellen Fall bin ich zu MS SQL gezwungen. Hab mich vorher nicht getraut das zu sagen. Normal mach ich sowas auch mit MySQL, ehrlich! Vielleicht kennt sich ja jemand damit aus und sagt "Achso, ja da geht das ganz einfach!".

    Also vereinfacht sieht das Formular so aus:
    Name, eMail, noch paar Felder, Bemerkungen

    Da viele Mails ankommen, wird eine Tabelle mit allen Feldern mit der Zeit sehr groß denke ich. Ist es da ratsam die Bemerkungen auszulagern oder hat die Größe keinen Einfluss auf die Geschwindigkeit, wenn ich in SELECT und UPDATE Anweisungen die Bemerkungen garnicht anwähle? Also "SELECT name, email" Oder sind bei Text die Geschwindigkeiten eh so marginal verschieden, dass es sich nicht lohnt?

    Brauche ich eigentlich IDs? Bin jetzt soweit, als Schlüssel einfach Datum und Name zu nehmen, weil es gegen 0 geht, dass zur gleichen Zeit eine gleich heißende Person was schreibt.
    Oder sind IDs trotzdem gut?

    Vielen Dank!
     
Die Seite wird geladen...

Diese Seite empfehlen