MySQL在脚本中包含脚本

Jam*_*mes 26 mysql sql scripting

我参与的项目是将项目从Oracle迁移到MySQL.在Oracle中,我可以创建一个SQL脚本,当通过命令行运行批处理时,该脚本引用或包含其他外部SQL脚本文件.我有一个名为CreateAllTables.sql的脚本在内部看起来像这样:

@tables\Site.sql
@tables\Language.sql
@tables\Country.sql
@tables\Locale.sql
@tables\Tag.sql
Run Code Online (Sandbox Code Playgroud)

我已经知道MySQL命令行"Source"命令,但我的目标是通过一个命令行调用来调用包含其他脚本的单个主.sql脚本文件,如下所示:

mysql --user=root --password --database=junkdb -vv < CreateAllTables.sql
Run Code Online (Sandbox Code Playgroud)

所以我的问题是我如何用MySQL做到这一点?

pil*_*row 27

source 适合我.

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

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

$ mysql ... < foo.sql
Run Code Online (Sandbox Code Playgroud)

现在表foo消失了,并且创建了bar.

  • -1这在脚本中不起作用,它不是解决方案! (2认同)

gar*_*nso 15

请注意,如果脚本通过支持它的mysql客户端运行,上面的"source"选项仅适用于我.(OP原始问题中引用的mysql命令行客户端恰好是其中一个客户端.)

但请记住,"source" 不是 sql语言的许多特定于mysql的扩展之一.它是一个客户端命令,而不是一个sql语句,

你为什么在乎?

如果您通过替代方法(例如,通过JDBC的"execSQL")将sql脚本发送到MySQL服务器,则"source"命令将不适用于包含其他脚本.

  • 很有帮助; 谢谢你们改变规则. (4认同)
  • 是的,我知道.我宁愿只是在接受的答案的评论列表中添加评论.评论流中存在一些混淆,我认为这些信息有助于澄清.但这是一个新的stackoverflow帐户,我还没有足够的信誉来评论.(至少我认为这就是我无法发表评论的原因.)所以我刚刚发布了一个新的"澄清"答案.如果这冒犯了,请道歉. (2认同)

Rol*_*man 7

你可以在mysql中使用source做类似的事情.

我有这些内容的inc1.sql:

use test;
create table testinc(
   id int  
);
Run Code Online (Sandbox Code Playgroud)

和inc2.sql这样:

insert into testinc values (1);
Run Code Online (Sandbox Code Playgroud)

和main.sql这样:

source inc1.sql
source inc2.sql
Run Code Online (Sandbox Code Playgroud)

我可以像这样运行main.sql:

mysql -uroot -pmysql -P3351 -e"Source main.sql"
Run Code Online (Sandbox Code Playgroud)

之后,我可以通过这样做验证它是否有效:

mysql> use test;
Database changed
mysql> select * from testinc;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)