No, non puoi inserire in più tabelle in un comando MySQL. Puoi comunque utilizzare le transazioni.
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;
Dai un'occhiata a LAST_INSERT_ID()
per riutilizzare i valori di incremento automatico.
Hai detto "Dopo tutto questo tempo cercando di capirlo, non funziona ancora. Non posso semplicemente inserire l'ID appena generato in una $var e inserire quella $var in tutti i comandi MySQL? "
Consentitemi di elaborare:ci sono 3 possibili modi qui:
-
Nel codice che vedi sopra. Questo fa tutto in MySQL e il
LAST_INSERT_ID()
nella seconda istruzione sarà automaticamente il valore della colonna di autoincremento che è stata inserita nella prima istruzione.Sfortunatamente, quando la seconda istruzione inserisce righe in una tabella con una colonna a incremento automatico, il
LAST_INSERT_ID()
verrà aggiornato a quello della tabella 2 e non alla tabella 1. Se in seguito è ancora necessario quello della tabella 1, dovremo memorizzarlo in una variabile. Questo ci porta ai modi 2 e 3: -
Conserverà il
LAST_INSERT_ID()
in una variabile MySQL:INSERT ... SELECT LAST_INSERT_ID() INTO @mysql_variable_here; INSERT INTO table2 (@mysql_variable_here, ...); INSERT INTO table3 (@mysql_variable_here, ...);
-
Conserverà il
LAST_INSERT_ID()
in una variabile aphp (o qualsiasi linguaggio che possa connettersi a un database, a tua scelta):INSERT ...
- Usa la tua lingua per recuperare il
LAST_INSERT_ID()
, eseguendo l'istruzione letterale in MySQL o utilizzando ad esempiomysql_insert_id()
di php che lo fa per te INSERT [use your php variable here]
AVVISO
Qualunque sia il modo che scegli per risolvere il problema, devi decidere cosa dovrebbe accadere se l'esecuzione dovesse essere interrotta tra una query e l'altra (ad esempio, il server del database si arresta in modo anomalo). Se riesci a convivere con "alcuni hanno finito, altri no", non continuare a leggere.
Se, tuttavia, decidi "o tutte le query finiscono o nessuna termina - non voglio righe in alcune tabelle ma nessuna riga corrispondente in altre, voglio sempre che le tabelle del mio database siano coerenti", devi racchiudere tutte le istruzioni in una transazione . Ecco perché ho usato BEGIN
e COMMIT
qui.