【问题标题】:MySQL Include a script within scriptMySQL 在脚本中包含一个脚本
【发布时间】:2012-10-09 05:07:27
【问题描述】:

我参与的是一个将项目从 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 做到这一点?

【问题讨论】:

    标签: sql mysql scripting


    【解决方案1】:

    source 为我工作。

    # -- foo.sql
    DROP TABLE foo;
    source bar.sql
    
    # -- bar.sql
    CREATE TABLE bar (i INT NOT NULL);
    
    $ mysql ... < foo.sql
    

    现在表 foo 消失了,bar 被创建了。

    【讨论】:

    • +1 有趣的是,我看到的所有示例似乎都表明这只是一个命令行函数。我对 MySQL 还是很陌生。
    • @James,你是对的,mysql(1) 手册页确实强烈建议这只是一个交互模式命令。
    • 可以在mysql命令行客户端做帮助,查看客户端可能理解的命令(不是sql server命令,mysql命令行命令):mysql> help 获取MySQL产品和服务的信息,请访问:mysql.com 有关开发人员信息,包括 MySQL 参考手册,请访问:dev.mysql.com 要购买 MySQL 网络支持、培训或其他产品,请访问:shop.mysql.com 所有 MySQL 命令列表:请注意,所有文本命令必须排在第一位并以 ';' 结尾? (\?) “帮助”的同义词。 ...等等...
    • @avok00:我可以具体问一下您的意思是什么“[t]his 在脚本中不起作用”? OP 想要一个批处理或脚本解决方案,该解决方案使用“顶级”.sql 文件来包含和执行其他命名的.sql 文件。这正是我所展示的。 the other answer 也显示了细微的变化。
    • 在 MySQL Workbench 6.1 中不起作用,但在我的 Windows 8.1 安装中可以从命令行运行。
    【解决方案2】:

    请注意,上面的“源”选项仅在脚本通过支持它的 mysql 客户端运行时才有效(对我而言)。 (OP 的原始问题中引用的 mysql 命令行客户端恰好是这些客户端之一。)

    但请记住,“源”不是对 sql 语言的许多特定于 mysql 的扩展之一。这是一个客户端命令,而不是一个 sql 语句,

    你为什么在乎?

    如果您通过替代方法(例如,通过 JDBC 的“execSQL”)将 sql 脚本发送到 MySQL 服务器,则“source”命令将无法包含其他脚本。

    【讨论】:

    • 这不能回答问题。
    • 是的,我知道。我宁愿简单地在接受的答案的评论列表中添加评论。该评论流存在一些混乱,我认为此信息将有助于澄清。但这是一个新的 stackoverflow 帐户,我还没有足够的信誉发表评论。 (至少我认为这就是我无法评论的原因。)。所以我只是发布了一个新的“澄清”答案。如有冒犯请见谅。
    【解决方案3】:

    你可以在 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 2015-03-26
      • 2012-02-26
      • 1970-01-01
      • 2019-07-26
      相关资源
      最近更新 更多