最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.sql里的所有sql语句,这就涉及到执行多条语句的问题了。软件在CodeIgniter框架上开发的,CodeIgniter有封装好的执行sql语句的函数:$this->db->query('****'),但此函数一次只能执行一条sql语句。所以得另外想办法了。百度了下,找到了一些资料。multi_query()方法是完全按照在sql环境下的语句执行,所以可以一次执行多条sql语句(按sql语法拼写,每条语句以;结束)。

 $mysqli = new mysqli($this->db->hostname,$this->db->username,$this->db->password,$this->db->database);   //连接MySQL数据库
if ($mysqli->connect_errno) { //判断是否连接成功
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
} $mysqli->multi_query($dataStr); //执行sql语句

以下是百度到的参考资料:

使用mysqli对象中的query()方法每次调用只能执行一条SQL命令。如果需要一次执行多条SQL命令,就必须使用mysqli对象中的 multi_query()方法。具体做法是把多条SQL命令写在同一个字符串里作为参数传递给multi_query()方法,多条SQL之间使用分号 (;)分隔。如果第一条SQL命令在执行时没有出错,这个方法就会返回TRUE,否则将返回FALSE。

因为multi_query()方法能够连接执行一个或多个查询,而每条SQL命令都可能返回一个结果,在必要时需要获取每一个结果集。所以对该方 法返回结果的处理也有了一些变化,第一条查询命令的结果要用mysqli对象中的use_result()或store_result()方法来读取,当 然,使用store_result()方法将全部结果立刻取回到客户端,这种做法效率更高。另外,可以用mysqli对象中的 more_results()方法检查是否还有其他结果集。如果想对下一个结果集进行处理,应该调用mysqli对象中的next_result()方 法,获取下一个结果集。这个方法返回TRUE(有下一个结果)或FALSE。如果有下一个结果集,也需要使用use_result()或 store_result()方法来读取。执行多条SQL命令代码如下所示:

<?php
$mysqli = new mysqli("localhost", "mysql_user","mysql_pwd", "demo"); //连接MySQL数据库
if (mysqli_connect_errno()) {
   //检查连接错误
printf("连接失败: %s<br>", mysqli_connect_error());
exit();
} /* 将三条SQL命令使用分号(;)分隔, 连接成一个字符串 */ //设置查询字符集为GB2312
$query = "SET NAMES GB2312;"; //从MySQL服务器获取当前用户
$query .= "SELECT CURRENT_USER();"; //从contactinfo表中读取数据
$query .= "SELECT name,phone FROM contactinfo LIMIT 0,2"; //执行多条SQL命令
if ($mysqli->multi_query($query)) { do {
//获取第一个结果集
if ($result = $mysqli->store_result()) {
//遍历结果集中每条记录
while ($row = $result->fetch_row()) {
//从一行记录数组中获取每列数据
foreach($row as $data){
//输出每列数据
echo $data."&nbsp;&nbsp;"; }
//输出换行符号
echo "<br>";
}
//关闭一个打开的结果集
$result->close(); }
//判断是否还有更多的结果集
if ($mysqli->more_results()) {
//输出一行分隔线
echo "-----------------<br>"; }
} while ($mysqli->next_result()); //获取下一个结果集,并继续执行循环 }
$mysqli->close(); //关闭mysqli连接 ?>

输出结果如下所示:

  1. mysql_user@localhost
  2. -----------------
  3. 高某某   15801688338
  4. 洛某某   15801681234

在上面的示例程序中,使用mysqli对象中的multi_query()方法一次执行三条SQL命令,获取多个结果集并从中遍历数据。如果在命令 的处理过程中发生了错误,multi_query()和next_result()方法就会出现问题。multi_query()方法的返回值,以及 mysqli的属性errno、error、info等只与第一条SQL命令有关,无法判断第二条及以后的命令是否在执行时发生了错误。所以在执行 multi_query()方法的返回值是TRUE时,并不意味着后续命令在执行时没有出错。

mysql -- 一次执行多条sql语句的更多相关文章

  1. Jmeter连接MySQL配置(能执行多条sql语句)

    Database URL为MySQL的连接串,如果要执行多条SQL语句,后面还要添加“?allowMultiQueries=true”

  2. MyBatis一次执行多条SQL语句

    MyBatis一次执行多条SQL语句 有个常见的场景:删除用户的时候需要先删除用户的外键关联数据,否则会触发规则报错. 解决办法不外乎有三个:1.多条sql分批执行:2.存储过程或函数调用:3.sql ...

  3. java执行多条SQL语句

    一次执行多条SQL的技术要点如下: DatabaseMetaData接口是描述有关数据库的整体综合信息,由于DatabaseMetaData是接口,所以没有构造方法,故不能使用new来创建Databa ...

  4. jmert jdbc request支持执行多条sql语句并设置jdbc字符集

    1.jdbc request支持执行多条sql语句 在JDBC Connection Configuration中的sql连接字串中添加如下内容 allowMultiQueries=true 如下图: ...

  5. mybatis执行多条sql语句

    1,mybatis执行多条sql语句,有以下几种思路, a,存储过程 b,修改jdbc的参数,允许执行多条语句,如下所示: sqlserver可以直接使用begin,end来执行多条语句, mysql ...

  6. springBoot + mybatis实现执行多条sql语句出错解决方法

    在Idea中执行多条sql语句的修改(mybatis默认的是执行sql语句是执行单条,所以要执行多条的时候需要进行配置) 需要在连接字符串中添加上&allowMultiQueries=true ...

  7. Jmeter的JDBC请求执行多条SQL语句

    注:有mysqlconnector/j 3.1.1以上版本才支持执行多条sql语句 1.     下载jdbc驱动为了连接Mysql数据库,还需要有个jdbc驱动:mysql-connector-ja ...

  8. C#实现执行多条SQl语句,实现数据库事务

    C#实现执行多条SQl语句,实现数据库事务 在数据库中使用事务的好处,相信大家都有听过银行存款的交易作为事务的一个例子.事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的 ...

  9. c#中执行多条sql语句【ORA-00911: 无效字符】

    问题描述: 在plsql里执行多条sql语句的时候,使用“,”(逗号)分隔,测试可以执行多条,而在C#执行多条sql语句的时候[ORA-00911: 无效字符]. 有时我们需要一次性执行多条sql语句 ...

随机推荐

  1. Oracle 检索数据

    SELECT  *  |    {   [ DISTINCT  ]    column   |    expression   [   alias   ]  ,   ...    } FROM  ta ...

  2. Map 和 WeakMap 数据结构

    Map 和 WeakMap 是ES6 新增的数据结构 一.Map 它们本质与对象一样,都是键值对的集合,但是他们与 Object 对象主要的不同是,键可以是各种类型的数值,而Object 对象的键 只 ...

  3. 〖Android〗把CM(Android)源代码导入eclipse的正确方法(2013-7-3)

    1. 首先应当使CM代码成功编译过一次: cd /path/to/cm . build/envsetup lunch full-eng mka 2. 配置eclipse开发的基本环境 cd /path ...

  4. 娓娓道来c指针 (4)解析c的声明语句

    (4)解析c的声明语句 在继续探索c指针之前.有必要来解析下c语言中复杂的声明语法. 仅仅须要记住两则:一个原则,一个规则. 原则:先看标示符. 规则:运算符优先级是规则. 举例说明 1.最简单的 i ...

  5. [Done]java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed

    java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed ...

  6. soap 1.1 访问服务

    访问http://www.webxml.com.cn/zh_cn/web_services_item.aspx?id=494536374B66307964534D3D 可以获取一些外网提供的服务. 例 ...

  7. Ubuntu系统使用命令禁用触摸板等输入设备

    [日期:2012-02-22]   本人用的Ubuntu 10.04系统,笔记本上有鼠标和触摸板.默认下,触摸板是开启的, 有时候打字的时候会不时碰到触摸板,添了不少麻烦,所以得禁用触摸板,限于目前所 ...

  8. [转载]最完整PHP.INI中文版

    [转载]最完整PHP.INI中文版 http://www.21andy.com/blog/20090718/1344.html 最完整PHP.INI中文版 适用于 php-5.2 的 php.ini ...

  9. 委托与事件代码详解与(Object sender,EventArgs e)详解

    委托与事件代码详解 using System;using System.Collections.Generic;using System.Text; namespace @Delegate //自定义 ...

  10. Step by Step Learn Python(1)

    print "Hello World!" action = raw_input("please select your action{1, 2, 3, 4, 5, 6, ...