Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL si inserisce in più tabelle? (Normalizzazione del database?)

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:

  1. 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:

  2. 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, ...);
    
  3. 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 esempio mysql_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.