2010-10-05 24 views
31

en supposant que j'ai deux tables, names et phones et je veux insérer des données à partir de certaines entrées aux tableaux, dans une requête-Comment cela peut-il être fait?sql - insérer dans plusieurs tables dans une requête

S'il vous plaît, si cela peut être fait, expliquez la syntaxe.

+0

Je suppose que la réponse sera "Vous ne pouvez pas" pour toutes les bases de données, mais juste au cas où, quelle base de données utilisez-vous? – LittleBobbyTables

+0

mysql, dernière version (j'ai vu quelques solutions qui utilisaient "sortie" pour ce travail, mais je préfère éviter les balades ..) – yossi

Répondre

19

MySQL ne prend pas en charge l'insertion multi-tables dans un seul INSERT statement. Oracle est le seul que je sache qui fait, curieusement ...

INSERT INTO NAMES VALUES(...) 
INSERT INTO PHONES VALUES(...) 
+7

La réponse de Joshua Smith est meilleure que celle-ci. –

60

Vous ne pouvez pas. Toutefois, vous pouvez utiliser une transaction et les deux doivent être contenues dans une transaction.

START TRANSACTION; 
INSERT INTO table1 VALUES ('1','2','3'); 
INSERT INTO table2 VALUES ('bob','smith'); 
COMMIT; 

http://dev.mysql.com/doc/refman/5.1/en/commit.html

+1

Acclamations Joshua, cela m'a aidé beaucoup. Bien que dans MySql je pense que ce soit START au lieu de BEGIN. – steve

+2

Quel est le but des transactions? Je comprends que si quelque chose se passe mal dans l'une des requêtes, toutes les requêtes seront annulées. Est-ce que c'est ça? Ou y a-t-il aussi un gain de performance? – Clox

+3

@Clox: C'est en partie le but des transactions. L'autre but est que la base de données soit dans un état stable connu avant, pendant et après la transaction. Cela signifie que les requêtes simultanées ne verront jamais de données partiellement validées. –

3

J'ai eu le même problème. Je le résous avec une boucle for.

Exemple:

Si je veux écrire dans 2 identiques tables, en utilisant une boucle

for x = 0 to 1 

if x = 0 then TableToWrite = "Table1" 
if x = 1 then TableToWrite = "Table2" 
    Sql = "INSERT INTO " & TableToWrite & " VALUES ('1','2','3')" 
NEXT 

soit

ArrTable = ("Table1", "Table2") 

for xArrTable = 0 to Ubound(ArrTable) 
Sql = "INSERT INTO " & ArrTable(xArrTable) & " VALUES ('1','2','3')" 
NEXT 

Si vous avez une petite requête que je ne pas savoir si c'est la meilleure solution, mais si votre requête est très grande et qu'elle se trouve dans un script dynamique avec les conditions if/else/case, c'est une bonne solution.

+0

utile lorsque vous devez insérer les mêmes valeurs et/ou le même nombre de valeurs pour chaque table. –