我收到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 键?
答案 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');