2009-12-29 5 views
19

Je suis impliqué dans un projet de migration d'un projet d'Oracle vers MySQL. Dans Oracle, j'ai la possibilité de créer un script SQL qui référence ou intègre d'autres fichiers de script SQL externes lorsque le batch est exécuté via une ligne de commande. J'ai un script appelé CreateAllTables.sql qui ressemble à ceci interne:MySQL Inclure un script dans le script

@tables\Site.sql 
@tables\Language.sql 
@tables\Country.sql 
@tables\Locale.sql 
@tables\Tag.sql 

Je suis déjà au courant de la ligne de commande MySQL de commande « Source », mais mon but est d'invoquer un seul fichier principal de script .sql que comprend d'autres scripts via un appel en ligne de commande unique comme celui-ci:

mysql --user=root --password --database=junkdb -vv < CreateAllTables.sql 

Alors ma question est de savoir comment puis-je faire avec MySQL?

Répondre

22

source fonctionne pour moi.

# -- foo.sql 
DROP TABLE foo; 
source bar.sql 

# -- bar.sql 
CREATE TABLE bar (i INT NOT NULL); 

$ mysql ... < foo.sql 

maintenant la table foo est allé et bar est créé.

+0

+ 1 Intéressant, tous les exemples que j'ai vus semblaient suggérer que c'était une fonction de ligne de commande seulement. Je suis encore assez nouveau pour MySQL. – James

+0

@James, vous avez raison, la page de manuel 'mysql (1)' suggère fortement qu'il s'agit uniquement d'une commande en mode interactif. – pilcrow

+1

Vous pouvez faire aide dans le client de ligne de commande mysql, et voir les commandes possibles compris par le client (pas de commandes de serveur SQL, ligne de commande mysql commandes): mysql> aide Pour plus d'informations sur les produits MySQL et services, veuillez consulter: http://www.mysql.com/ Pour plus d'informations de développeur, y compris le Manuel de référence MySQL, consultez le site: http://dev.mysql.com/ Pour acheter MySQL Network de soutien, de formation ou d'autres produits, visitez: https://shop.mysql.com/ Liste de toutes les commandes de MySQL: N ote que toutes les commandes de texte doivent être en premier et se terminer par ';' ? (\?) Synonyme de 'help '. ... etc ... –

7

Vous pouvez faire une chose similaire avec la source dans mysql.

Je inc1.sql avec ce contenu:

use test; 
create table testinc(
    id int 
); 

Et inc2.sql comme ceci:

insert into testinc values (1); 

et main.sql comme ceci:

source inc1.sql 
source inc2.sql 

Et je peut exécuter main.sql comme ceci:

mysql -uroot -pmysql -P3351 -e"Source main.sql" 

Après que je peux vérifier que cela a fonctionné en faisant ceci:

mysql> use test; 
Database changed 
mysql> select * from testinc; 
+------+ 
| id | 
+------+ 
| 1 | 
+------+ 
1 row in set (0.00 sec) 
10

Notez que l'option « source », ci-dessus, ne fonctionne que (pour moi) si le script est exécuté par un client MySQL supports il. (Le client MySQL en ligne de commande référencée dans la question initiale de l'OP se trouve être l'un de ces clients.)

Mais rappelez-vous « source » est pas l'une des nombreuses extensions spécifiques à MySQL au langage SQL. C'est une commande client, pas une instruction SQL,

Pourquoi vous en souciez-vous? Si vous envoyez votre script SQL au serveur MySQL via une méthode alternative (par exemple "execSQL" de JDBC), la commande "source" ne fonctionnera pas pour l'inclusion d'autres scripts.

+1

Cela ne répond pas à la question. – David

+2

Yah, je sais. J'aurais préféré ajouter simplement un commentaire à la liste de commentaires de la réponse acceptée. Il y a une certaine confusion dans ce flux de commentaires et j'ai pensé que cette information aiderait à clarifier. Mais ceci est un nouveau compte stackoverflow et je n'ai pas encore assez de crédibilité pour commenter. (Au moins je pense que c'est pourquoi je ne peux pas commenter.). Donc, je viens de poster une nouvelle "clarification" réponse à la place. Toutes mes excuses si cela vous offense. –

+2

Très utile; merci d'avoir plié les règles. –

Questions connexes