1.5 批处理

在前面几个小节中,我们在 mysql 的交互界面中,可以输入语句、执行、并查看其运行结果。在这个小节中,将介绍 mysql 指令在批处理模式下的应用,将多条语句写入到本地一个文本文件中,在 mysql 指令中读取该文件的语句并执行。

shell> mysql < batch-file

假如您是在 windows 下执行批处理,可能会遇到由特殊字符而导致的错误,那么您可以使用下面的方式进行处理:

C:\> mysql -e "source batch-file"

如果您连接 MySQL 服务器需要带参数,那么您可以这样操作:

shell> mysql -h host -u user -p < batch-file
Enter password: ********
Note

您可以使用 1.1 mysql的连接与退出 小节中提到的连接 MySQL 服务器的方法,末尾加上 < batch-file 即可。

我们来看一下实际的使用,我们先删除表 pet 中的所有数据;

mysql> delete from pet;
Query OK, 9 rows affected (0.01 sec)

batch-file 文件中编辑语句;

INSERT INTO `pet` VALUES ('Fluffy', 'Harold', 'cat', 'f', '1993-02-04', NULL);
INSERT INTO `pet` VALUES ('Claws', 'Gwen', 'cat', 'm', '1994-03-17', NULL);
INSERT INTO `pet` VALUES ('Buffy', 'Harold', 'dog', 'f', '1989-05-13', NULL);
INSERT INTO `pet` VALUES ('Fang', 'Benny', 'dog', 'm', '1990-08-27', NULL);
INSERT INTO `pet` VALUES ('Bowser', 'Diane', 'dog', 'm', '1989-08-30', '1995-07-29');
INSERT INTO `pet` VALUES ('Chirpy', 'Gwen', 'bird', 'f', '1998-09-11', NULL);
INSERT INTO `pet` VALUES ('Whistler', 'Gwen', 'bird', NULL, '1997-12-09', NULL);
INSERT INTO `pet` VALUES ('Slim', 'Benny', 'snake', 'm', '1996-04-29', NULL);
INSERT INTO `pet` VALUES ('Puffball', 'Diane', 'hamster', 'f', '1999-03-30', NULL);

执行;

shell> mysql -h localhost -u root -p menagerie < /data/www/mysql/batch-file 
Enter password: ********

如果 batch-file 文件中的某一条语句错误,那么操作将在错误处中止,您想要忽略该错误,继续执行,可以增加 --force 选项(-f

shell> mysql -h localhost -u root -p menagerie --force < /data/www/mysql/batch-file
Enter password: ********

为什么要使用这种方式?

  • 经常需要执行的 SQL 语句(比方说每小时、每天、每周),避免每次重复敲入;
  • 通过文本编辑器复制、拷贝的操作,使编辑更容易、更直观,尤其在多条 SQL 的情况下;
  • 复杂的 SQL ;在文本编辑器中修改更方便,提高调试效率;
  • 大量输出的查询,您可以通过如下的方式翻页显示;
    shell> mysql < batch-select-file | more
    
  • 输出结果写入文件,可以通过 -t-v 控制输出格式;
    shell> mysql < batch-select-file > mysql.out
    
  • 可以将批处理的文件很方便的分享给其他人;
  • 应用于没有交互模式的场景,例如: cron 任务,这个是我们在实际应用最广泛的;

交互模式下使用 SOURCE 和 .

source 和 . 同样可以执行批处理。

mysql> souce /data/www/mysql/batch-file;
mysql> \. /data/www/mysql/batch-file

注意两者的区别,SOURCE 末尾带分号,而 . 不需要,这里我们又遇到一个不需要带分号的语句。

results matching ""

    No results matching ""