注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

^_^ china.ygw的博客

软件开发/c/c++/数据库/开源/linux/windows/安全/网络...

 
 
 

日志

 
 
 
 

UnixODBC中涉及MySQL多表更新的“No database changed”问题  

2011-07-24 22:14:54|  分类: UnixODBC |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

       在Windows上进行数据库的开发,一般是通过ODBC进行相关操作。而在Linux下,更多是采用UnixODBC,它也是大家熟悉的开源软件之一。UnixODBC的主页是http://www.unixodbc.org/,最新版本是2.3.0。
       使用UnixODBC操作MySQL数据库时,一般配置一个数据库dsn,其对应的odbcinst.ini及odbc.ini文件配置信息如下:

       /etc/odbcinst.ini文件内容:
              [MySQL]
              Description = ODBC for MySQL
              Driver = /usr/lib/libmyodbc.so
              FileUsage = 1

        /etc/odbc.ini文件内容:
              [mysql_dsn]
              Description = MySQL database test
              Driver = MySQL
              Server = localhost
              Database = test
              Port = 3306

              User = xxx

              Pwd = xxx

        对于有些项目,因为涉及多个数据库操作,相关数据库操作SQL语句都会在相应表名前增加数据库名,此时,odbc.ini中dsn的Database数据库名称可能会填空值。而且对于一些设备来说,可能在后台随时运行着多个系统,连接着多个数据库,一般情况下,数据库配置信息中的数据库名称都填空,通过配置时再填写正确的值。

        在大部分情况下,dsn中的数据库名称填空没有什么问题。但是在操作MySQL数据库中(其它数据库没有测试),如果此时的SQL语句涉及多表更新,并且目标数据表存在临时表时,此时该更新语句失败,错误信息“ERROR 1046 (3D000): No database selected”。问题环境如下:

         1)MySQL 5.5.14版本(运行Fedora 14系统);

         2)UnixODBC 2.3.0版本(配置如前述,其中数据库名为空);

         2)测试数据表结构如下:

               create table if not exists test1.table1(
                    id int unsigned auto_increment primary key,
                    name varchar(64) not null default '',
                    age int unsigned not null
               );

          3)测试更新SQL语句如下:

                update test1.table1 a, \
                      (select a.id \
                      from test1.table1 a \
                             inner join (select 1 as id) b on a.id = b.id) b \
                set a.name = 'test' \
                 where a.id = b.id

       当前很多项目的数据库设计都比较复杂,考虑到性能等因素,往往要求多次执行的数据库操作合并为一条SQL语句执行,一不注意可以就出现如上问题。

 

               

  评论这张
 
阅读(416)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018