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:
-
In de code die je hierboven ziet. Dit doet het allemaal in MySQL, en de
LAST_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: -
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, ...);
-
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'smysql_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.