更新时出现MySQL错误1157,但是我在where子句中使用主键

时间:2019-06-08 03:04:28

标签: mysql

我收到1157错误

  

错误代码:1175。您正在使用安全更新模式,并且试图在没有使用KEY列的WHERE的情况下更新表。     要禁用安全模式,请在“首选项”->“ SQL编辑器”中切换选项,然后重新连接。

当我尝试执行此语句时

def meshAnalysis(x,y,w,h,n,pointsList):
    fig, ax = plt.subplots(1,figsize=(4,h/w*4))
    dx = w/n
    dy = h/n
    ax.set_xlim([x,x+w])
    ax.set_ylim([y,y+h])
    for i,j in [(i,j) for i in range(n) for j in range(n)]: ax.add_patch(Rectangle((x+i*dx,y+j*dy), dx, dy, alpha=.3,
        ec='black',
        color='blue'))
    if (n == 1):
        return
    meshAnalysis(0,0,2,3,2,6)

这是UPDATE ip SET ip_countryCode = 'GB', ip_countryName = 'United Kingdom', ip_city = 'London' WHERE BINARY ip_ip >= INET6_ATON('2.57.77.0') AND BINARY ip_ip <= INET6_ATON('2.57.77.255'); 表的创建表

ip

我在这里做错了什么?为什么我会收到此错误,但是where子句中使用了 Primary 键?

2 个答案:

答案 0 :(得分:2)

仅使用键列是不够的,您必须以允许使用索引查找行的方式使用键列。来自documentation

  

即使优化程序决定不使用键列上的索引,即使使用WHERE子句中指定的键,UPDATE和DELETE语句也可能在安全更新模式下产生错误。

由于您正在测试BINARY ip_ip的值,而不仅仅是ip_ip本身,因此它无法使用索引,因此会出现错误。

是否可以使用函数将INET6_ATON()的结果转换为varbinary,而不是在列上使用BINARY运算符?然后它应该能够使用索引,并且不会出现错误。

UPDATE ip 
SET 
    ip_countryCode = 'GB',
    ip_countryName = 'United Kingdom',
    ip_city = 'London' 

WHERE ip_ip BETWEEN CAST(INET6_ATON('2.57.77.0') AS BINARY(16)) AND 
                    CAST(INET6_ATON('2.57.77.255') AS BINARY(16);

答案 1 :(得分:1)

您可以在更新查询之前添加SET SQL_SAFE_UPDATES=0;。使用此工具时要小心,因为它可能会进行意外的数据修改。

或者您可以尝试在where子句中包含列ip_countryCode

UPDATE ip 
SET 
    ip_countryCode = 'GB',
    ip_countryName = 'United Kingdom',
    ip_city = 'London' 

WHERE BINARY ip_ip >= INET6_ATON('2.57.77.0') AND 
      BINARY ip_ip <= INET6_ATON('2.57.77.255') AND ip_countryCode <> 'GB';

或者您可以删除BINARY函数

WHERE ip_ip >= INET6_ATON('2.57.77.0') AND 
      ip_ip <= INET6_ATON('2.57.77.255');