MySQL sql_safe_update简析

1.SQL解析时,如果开启这个参数,发现谓词为空则抛异常:

1
2
3
4
5
6
if  ((thd->variables.option_bits & OPTION_SAFE_UPDATES) && !select_lex->where)
{
   my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,
              ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));
   DBUG_RETURN(TRUE);
}


2.Delete时:

2.1如果full Join则抛异常

1
2
if  ((thd->variables.option_bits & OPTION_SAFE_UPDATES) && error_if_full_join(join))
   DBUG_RETURN(1);


2.2如果谓词为常数则抛异常

1
2
3
4
5
6
if  (safe_update && const_cond)
{
   my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,
              ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));
   DBUG_RETURN(TRUE);
}


2.3如果谓词无可用索引并且没有limit抛异常

1
2
3
4
5
6
7
8
9
10
11
12
if  (table->quick_keys.is_clear_all())
{
   thd->server_status|=SERVER_QUERY_NO_INDEX_USED;
   if  (safe_update && !using_limit)
   {
     delete  select;
     free_underlaid_joins(thd, select_lex);
     my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,
                ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));
     DBUG_RETURN(TRUE);
   }
}


3.Update时:

3.1如果full join则抛异常

同上

3.2如果谓词无可用索引并且没有limit抛异常

1
2
3
4
5
6
7
8
9
10
if  (table->quick_keys.is_clear_all())
{
   thd->server_status|=SERVER_QUERY_NO_INDEX_USED;
   if  (safe_update && !using_limit)
   {
     my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,
        ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE), MYF(0));
     goto  err;
   }
}


结论:Delete比update有更强的约束,即where条件不能为空或“永真”



本文转自MIKE老毕 51CTO博客,原文链接:http://blog.51cto.com/boylook/1328084,如需转载请自行联系原作者


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值