mysql -- 一次执行多条sql语句
最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的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." "; }
//输出换行符号
echo "<br>";
}
//关闭一个打开的结果集
$result->close(); }
//判断是否还有更多的结果集
if ($mysqli->more_results()) {
//输出一行分隔线
echo "-----------------<br>"; }
} while ($mysqli->next_result()); //获取下一个结果集,并继续执行循环 }
$mysqli->close(); //关闭mysqli连接 ?>
输出结果如下所示:
- mysql_user@localhost
- -----------------
- 高某某 15801688338
- 洛某某 15801681234
在上面的示例程序中,使用mysqli对象中的multi_query()方法一次执行三条SQL命令,获取多个结果集并从中遍历数据。如果在命令 的处理过程中发生了错误,multi_query()和next_result()方法就会出现问题。multi_query()方法的返回值,以及 mysqli的属性errno、error、info等只与第一条SQL命令有关,无法判断第二条及以后的命令是否在执行时发生了错误。所以在执行 multi_query()方法的返回值是TRUE时,并不意味着后续命令在执行时没有出错。
mysql -- 一次执行多条sql语句的更多相关文章
- Jmeter连接MySQL配置(能执行多条sql语句)
Database URL为MySQL的连接串,如果要执行多条SQL语句,后面还要添加“?allowMultiQueries=true”
- MyBatis一次执行多条SQL语句
MyBatis一次执行多条SQL语句 有个常见的场景:删除用户的时候需要先删除用户的外键关联数据,否则会触发规则报错. 解决办法不外乎有三个:1.多条sql分批执行:2.存储过程或函数调用:3.sql ...
- java执行多条SQL语句
一次执行多条SQL的技术要点如下: DatabaseMetaData接口是描述有关数据库的整体综合信息,由于DatabaseMetaData是接口,所以没有构造方法,故不能使用new来创建Databa ...
- jmert jdbc request支持执行多条sql语句并设置jdbc字符集
1.jdbc request支持执行多条sql语句 在JDBC Connection Configuration中的sql连接字串中添加如下内容 allowMultiQueries=true 如下图: ...
- mybatis执行多条sql语句
1,mybatis执行多条sql语句,有以下几种思路, a,存储过程 b,修改jdbc的参数,允许执行多条语句,如下所示: sqlserver可以直接使用begin,end来执行多条语句, mysql ...
- springBoot + mybatis实现执行多条sql语句出错解决方法
在Idea中执行多条sql语句的修改(mybatis默认的是执行sql语句是执行单条,所以要执行多条的时候需要进行配置) 需要在连接字符串中添加上&allowMultiQueries=true ...
- Jmeter的JDBC请求执行多条SQL语句
注:有mysqlconnector/j 3.1.1以上版本才支持执行多条sql语句 1. 下载jdbc驱动为了连接Mysql数据库,还需要有个jdbc驱动:mysql-connector-ja ...
- C#实现执行多条SQl语句,实现数据库事务
C#实现执行多条SQl语句,实现数据库事务 在数据库中使用事务的好处,相信大家都有听过银行存款的交易作为事务的一个例子.事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的 ...
- c#中执行多条sql语句【ORA-00911: 无效字符】
问题描述: 在plsql里执行多条sql语句的时候,使用“,”(逗号)分隔,测试可以执行多条,而在C#执行多条sql语句的时候[ORA-00911: 无效字符]. 有时我们需要一次性执行多条sql语句 ...
随机推荐
- 【Unity优化】怎样实现Unity编辑器中的协程
Unity编辑器中何时须要协程 当我们定制Unity编辑器的时候,往往须要启动额外的协程或者线程进行处理.比方当运行一些界面更新的时候,须要大量计算,假设用户在不断修正一个參数,比方从1变化到2.这种 ...
- 算法笔记_147:有向图欧拉回路判断应用(Java)
目录 1 问题描述 2 解决方案 1 问题描述 Description In order to make their sons brave, Jiajia and Wind take them t ...
- visio扩大画布的大小
鼠标移到画布的边界按住Ctrl,即可扩大画布的大小
- 总结js(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作
http://hi.baidu.com/yashua839/blog/item/131fdb2fe547ef221f3089af.html一.Iframe 篇 //&&&&am ...
- C++的引用与const指针的关系以及各种传递方式
首先我们知道 const int *p 与 int const *p 是一样的,即 *p 是常量:而 int * const p 跟上面是不一样的,即 p 是常量:我们知道引用只是一个别名,与变量共享 ...
- 怎样给ExecutorService异步计算设置超时
ExecutorService接口使用submit方法会返回一个Future<V>对象.Future表示异步计算的结果.它提供了检查计算是否完毕的方法,以等待计算的完毕,并获取计算的结果. ...
- 报错 System.ComponentModel.Win32Exception:拒绝访问,如何以管理员身份调试应用程序
打开程序集的属性窗口,找到“安全性”设置,其中有一个“启用 ClickOnce 安全性设置”,勾选后再反勾选该复选框. 此时在解决方案资源管理器中,就可以找到 app.manifest 文件,勾选“启 ...
- Python 算法(2) 哈夫曼编码 Huffman Encoding
这个问题原始是用来实现一个可变长度的编码问题,但可以总结成这样一个问题,假设我们有很多的叶子节点,每个节点都有一个权值w(可以是任何有意义的数值,比如它出现的概率),我们要用这些叶子节点构造一棵树,那 ...
- MySQL Subquery
Summary: in this tutorial, we will show you how to use the MySQL subquery to write complex queries a ...
- 基于jQuery页面窗口拖动预览效果
今天给大家分享一款基于Query页面窗口拖动预览效果.这是一款基于jQuery+HTML5实现的模拟页面窗口显示拖动窗口预览特效.这款实例适用浏览器:IE8.360.FireFox.Chrome.Sa ...