Mysql
 sql >> Base de données >  >> RDS >> Mysql

Insertion MySQL dans plusieurs tables ? (Normalisation de la base de données ?)

Non, vous ne pouvez pas insérer dans plusieurs tables dans une seule commande MySQL. Vous pouvez cependant utiliser les transactions.

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;

Jetez un oeil à LAST_INSERT_ID() pour réutiliser les valeurs d'auto-incrémentation.

Vous avez dit "Après tout ce temps à essayer de comprendre, cela ne fonctionne toujours pas. Est-ce que je ne peux pas simplement mettre l'ID qui vient d'être généré dans une $var et mettre cette $var dans toutes les commandes MySQL ? "

Permettez-moi d'élaborer :il y a 3 façons possibles ici :

  1. Dans le code que vous voyez ci-dessus. Cela fait tout dans MySQL, et le LAST_INSERT_ID() dans la deuxième instruction sera automatiquement la valeur de la colonne d'auto-incrémentation qui a été insérée dans la première instruction.

    Malheureusement, lorsque la deuxième instruction elle-même insère des lignes dans une table avec une colonne à incrémentation automatique, le LAST_INSERT_ID() sera mis à jour vers celui de la table 2, et non de la table 1. Si vous avez encore besoin de celui de la table 1 par la suite, nous devrons le stocker dans une variable. Cela nous amène aux voies 2 et 3 :

  2. Stockera le LAST_INSERT_ID() dans une variable MySQL :

    INSERT ...
    SELECT LAST_INSERT_ID() INTO @mysql_variable_here;
    INSERT INTO table2 (@mysql_variable_here, ...);
    INSERT INTO table3 (@mysql_variable_here, ...);
    
  3. Stockera le LAST_INSERT_ID() dans une variable php (ou tout langage pouvant se connecter à une base de données, de votre choix) :

    • INSERT ...
    • Utilisez votre langue pour récupérer le LAST_INSERT_ID() , soit en exécutant cette instruction littérale dans MySQL, soit en utilisant par exemple le mysql_insert_id() de php qui fait ça pour vous
    • INSERT [use your php variable here]

AVERTISSEMENT

Quelle que soit la manière de résoudre ce problème, vous devez décider de ce qui doit se passer si l'exécution doit être interrompue entre les requêtes (par exemple, votre serveur de base de données tombe en panne). Si vous pouvez vivre avec "certains ont fini, d'autres non", ne lisez pas la suite.

Si toutefois, vous décidez "soit toutes les requêtes se terminent, soit aucune ne se termine - je ne veux pas de lignes dans certaines tables mais pas de lignes correspondantes dans d'autres, je veux toujours que mes tables de base de données soient cohérentes", vous devez envelopper toutes les déclarations dans une transaction . C'est pourquoi j'ai utilisé le BEGIN et COMMIT ici.