sql >> Database >  >> RDS >> Mysql

MySQL invoegen in meerdere tabellen? (Database normalisatie?)

Nee, u kunt niet in meerdere tabellen invoegen in één MySQL-opdracht. U kunt echter wel transacties gebruiken.

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;

Kijk eens naar LAST_INSERT_ID() om waarden voor automatisch verhogen opnieuw te gebruiken.

Je zei:"Na al die tijd om erachter te komen, werkt het nog steeds niet. Kan ik niet gewoon de zojuist gegenereerde ID in een $var zetten en die $var in alle MySQL-commando's? "

Laat me het uitleggen:er zijn hier 3 mogelijke manieren:

  1. In de code die je hierboven ziet. Dit doet het allemaal in MySQL, en deLAST_INSERT_ID() in de tweede instructie zal automatisch de waarde zijn van de autoincrement-kolom die in de eerste instructie is ingevoegd.

    Helaas, wanneer de tweede instructie zelf rijen invoegt in een tabel met een auto-increment kolom, de LAST_INSERT_ID() wordt geüpdatet naar die van tabel 2, en niet naar tabel 1. Als je daarna die van tabel 1 nog nodig hebt, zullen we die in een variabele moeten opslaan. Dit leidt ons naar manieren 2 en 3:

  2. Zal de LAST_INSERT_ID() . op voorraad hebben in een MySQL-variabele:

    INSERT ...
    SELECT LAST_INSERT_ID() INTO @mysql_variable_here;
    INSERT INTO table2 (@mysql_variable_here, ...);
    INSERT INTO table3 (@mysql_variable_here, ...);
    
  3. Zal de LAST_INSERT_ID() . op voorraad hebben in aphp-variabele (of elke taal die verbinding kan maken met een database, naar keuze):

    • INSERT ...
    • Gebruik je taal om de LAST_INSERT_ID() . op te halen , ofwel door die letterlijke instructie in MySQL uit te voeren, of door bijvoorbeeld php's mysql_insert_id() te gebruiken die dat voor je doet
    • INSERT [use your php variable here]

WAARSCHUWING

Welke manier u ook kiest om dit op te lossen, u moet beslissen wat er moet gebeuren als de uitvoering wordt onderbroken tussen query's (bijvoorbeeld uw database-server crasht). Als je kunt leven met "sommigen zijn klaar, anderen niet", lees dan niet verder.

Als u echter besluit "alle query's worden voltooid of geen enkele - ik wil geen rijen in sommige tabellen, maar geen overeenkomende rijen in andere, ik wil altijd dat mijn databasetabellen consistent zijn", moet u alle instructies in een transactie plaatsen . Daarom heb ik de BEGIN . gebruikt en COMMIT hier.



  1. Records filteren met geaggregeerde functie SUM

  2. Meerdere updates in MySQL

  3. Hoe kan ik een afbeelding in een sqlite-database invoegen?

  4. Gekoppelde tabellen bijwerken in Access 2016 nadat de backend-database naar een nieuwe locatie is verplaatst