Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL in mehrere Tabellen einfügen? (Datenbanknormalisierung?)

Nein, Sie können in einem MySQL-Befehl nicht in mehrere Tabellen einfügen. Sie können jedoch Transaktionen verwenden.

BEGIN;
INSERT INTO users (username, password)
  VALUES('test', 'test');
INSERT INTO profiles (userid, bio, homepage) 
  VALUES(LAST_INSERT_ID(),'Hello world!', 'http://www.stackoverflow.com');
COMMIT;

Sehen Sie sich LAST_INSERT_ID() Autoincrement-Werte wiederverwenden.

Sie sagten:"Nach all der Zeit, in der ich versucht habe, es herauszufinden, funktioniert es immer noch nicht. Kann ich nicht einfach die gerade generierte ID in eine $var einfügen und diese $var in alle MySQL-Befehle einfügen?" em> "

Lassen Sie mich näher darauf eingehen:Hier gibt es 3 Möglichkeiten:

  1. In dem Code, den Sie oben sehen. Dies erledigt alles in MySQL und dieLAST_INSERT_ID() in der zweiten Anweisung steht automatisch der Wert der Autoincrement-Spalte, die in der ersten Anweisung eingefügt wurde.

    Wenn die zweite Anweisung selbst Zeilen in eine Tabelle mit einer Spalte mit automatischer Erhöhung einfügt, wird leider die LAST_INSERT_ID() wird auf die von Tabelle 2 aktualisiert und nicht auf Tabelle 1. Wenn Sie danach noch die von Tabelle 1 benötigen, müssen wir sie in einer Variablen speichern. Dies führt uns zu den Wegen 2 und 3:

  2. Lagert die LAST_INSERT_ID() in eine MySQL-Variable:

    INSERT ...
    SELECT LAST_INSERT_ID() INTO @mysql_variable_here;
    INSERT INTO table2 (@mysql_variable_here, ...);
    INSERT INTO table3 (@mysql_variable_here, ...);
    
  3. Lagert die LAST_INSERT_ID() in einer PHP-Variablen (oder einer beliebigen Sprache, die sich mit einer Datenbank Ihrer Wahl verbinden kann):

    • EINFÜGEN ...
    • Verwenden Sie Ihre Sprache, um die LAST_INSERT_ID() abzurufen , entweder indem Sie diese wörtliche Anweisung in MySQL ausführen oder beispielsweise mysql_insert_id() von php verwenden der das für dich erledigt
    • INSERT [verwenden Sie hier Ihre PHP-Variable]

WARNUNG

Welche Lösung Sie auch wählen, Sie müssen entscheiden, was passieren soll, wenn die Ausführung zwischen Abfragen unterbrochen wird (z. B. Ihr Datenbankserver stürzt ab). Wenn Sie mit "einige sind fertig, andere nicht" leben können, lesen Sie nicht weiter.

Wenn Sie sich jedoch entscheiden "entweder alle Abfragen beenden oder keine beenden - ich möchte keine Zeilen in einigen Tabellen, aber keine übereinstimmenden Zeilen in anderen, ich möchte, dass meine Datenbanktabellen immer konsistent sind", müssen Sie alle Anweisungen in eine Transaktion einschließen . Deshalb habe ich den BEGIN verwendet und COMMIT hier.