我参与的项目是将项目从Oracle迁移到MySQL。在Oracle中,我可以创建一个SQL脚本,当通过命令行运行批处理时,该脚本引用或包含其他外部SQL脚本文件。我有一个名为CreateAllTables.sql的脚本在内部看起来像这样:
@tables\Site.sql
@tables\Language.sql
@tables\Country.sql
@tables\Locale.sql
@tables\Tag.sql
我已经知道MySQL命令行“Source”命令,但我的目标是通过一个命令行调用来调用包含其他脚本的单个主.sql脚本文件,如下所示:
mysql --user=root --password --database=junkdb -vv < CreateAllTables.sql
所以我的问题是我如何用MySQL做这个?
答案 0 :(得分:25)
source
适合我。
# -- foo.sql
DROP TABLE foo;
source bar.sql
# -- bar.sql
CREATE TABLE bar (i INT NOT NULL);
$ mysql ... < foo.sql
现在表 foo 已消失,并且 bar 已创建。
答案 1 :(得分:15)
请注意,上面的“source”选项仅适用于(对我来说)脚本是通过支持它的mysql客户端运行的。 (OP原始问题中引用的mysql命令行客户端恰好是其中一个客户端。)
但请记住,“source”是不是 sql语言的许多特定于mysql的扩展之一。它是一个客户端命令,而不是一个sql语句,
为什么要关心?
如果您通过替代方法(例如,通过JDBC的“execSQL”)将sql脚本发送到MySQL服务器,则“source”命令将不适用于包含其他脚本。
答案 2 :(得分:7)
你可以在mysql中使用source做类似的事情。
我有这些内容的inc1.sql:
use test;
create table testinc(
id int
);
和inc2.sql这样:
insert into testinc values (1);
和main.sql像这样:
source inc1.sql
source inc2.sql
我可以像这样运行main.sql:
mysql -uroot -pmysql -P3351 -e"Source main.sql"
之后我可以通过这样做验证它是否有效:
mysql> use test;
Database changed
mysql> select * from testinc;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)