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

^_^ china.ygw的博客

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

 
 
 

日志

 
 
 
 

令人失望的MySQL BUG(ERROR 1442)  

2011-07-20 21:49:54|  分类: mysql |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        公司这几年一直使用MySQL数据库,从3.x版本一直到现在的最新版本5.5.14。一直以来,对于数据库开发这块,都是顺风顺水,没有什么问题。但是这段时间进行数据库性能测试时,发现了一个ERROR 1442 BUG(ERROR 1442 (HY000): Can't update table 'xxx' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.)。是的,个人认为应该是BUG,而不是其它。BUG模拟环境如下:

        MySQL最新的5.5.14版本(含Windows与Linux)。两个数据库test1与test2,两个数据库各有一个数据表table1与table2,两个数据表通过主键关联,其中table1有BEFORE UPDATE触发器,依据主键修改table2表的数据。相关SQL语句如下:

        create database if not exists test1;
        create database if not exists test2;

 

        drop table if exists test1.table1;
        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
       );

 

       drop table if exists test2.table2;
       create table if not exists test2.table2(
             id int unsigned primary key,
             name varchar(64) not null default '',
             address varchar(64) not null default ''
      );


      drop trigger if exists test1_table1_before_update;
      delimiter |
      create trigger test1_table1_before_update BEFORE UPDATE ON table1 FOR EACH ROW
      begin
            update test2.table2 set name = NEW.name WHERE id = NEW.id;
      end;
      | 
      delimiter ;


      insert into test1.table1 values(1, '小白', 1);
      insert into test1.table1 values(2, '小黑', 2);
      insert into test1.table1 values(3, '小黄', 3);
      insert into test1.table1 values(4, '小红', 4);
      insert into test1.table1 values(5, '小蓝', 5);

 

      insert into test2.table2 values(1, '小白', '白色街道1号');
      insert into test2.table2 values(2, '小黑', '黑色街道2号');
      insert into test2.table2 values(3, '小黄', '黄色街道3号');
      insert into test2.table2 values(4, '小红', '红色街道4号');
      insert into test2.table2 values(5, '小蓝', '蓝色街道5号');

      好,以上是BUG的模拟环境,下面是引发BUG的SQL语句:

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

      从上SQL语句执行后,就会出现以前说的“ERROR 1442 (HY000): Can't update table 'table2' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
”问题。从SQL语句本身来看,没有什么问题。要修改的是test1.table1,虽然其包含before update触发器,并触发test2.table2数据表的修改,但是SQL语句中test2.table2只是作为辅助查询条件,以满足test1.table1中指定记录的修改。

       网上搜索了一下这个问题,基本上没有涉及前述情况,好不容易搜到一些,提到目前的几大数据库中(Sql SERVER、Oracle、DB2等)只有MySQL有这个问题,看来想否定它的BUG都不行啊。

       这个问题的郁闷之处在于,为了提高效率,很多时候会把多个SQL语句进行合并,只存在唯一的一条,以此提高执行效率,但是在触发器使用比较广泛的时候,这个问题就非常不幸地被频繁撞上了。特别是我据此进行修改,并发现修改前后的效率之比至少相差30多倍时,这种心情就更是奇差无比。

       希望MySQL早日解决该问题吧......

  评论这张
 
阅读(1905)| 评论(2)
推荐 转载

历史上的今天

评论

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

页脚

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