python 通过 pymysql 操作数据库表的 update 或 delete 操作时,报错 pymysql.err.InternalError: (1175, 'You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column')
的原因及解决方法。
原因
MySQL 启动了安全更新模式(safe update mode),该模式针对 update 和 delete 操作有如下约束:
- 针对
update
操作,有如下 2 个约束条件:- 当 where 条件中列(column)没有索引可用,且无 limit 限制时,会拒绝更新;
- 当 where 条件为常量,且无 limit 限制时,会拒绝更新。
- 针对
delete
操作,有如下 3 个约束条件:- 当 where 条件中列(column)没有索引可用,且无 limit 限制时,会拒绝更新;
- 当 where 条件为常量,且无 limit 限制时,会拒绝更新;
- 当 where 条件为空,且无 limit 限制时,会拒绝更新。
解决方法
如果未关闭数据库的安全更新模式的话,需要避免原因中列出的约束条件。
如果不想修改 sql 语句,那就要关闭数据库的安全更新模式,可以先通过如下命令查看更新模式:
mysql> SHOW VARIABLES LIKE 'sql_safe%';
它会输出如下结果:
+------------------+-------+ | Variable_name | Value | +------------------+-------+ | sql_safe_updates | ON | +------------------+-------+ 1 row in set (0.00 sec)
将打开的安全更新模式进行关闭,进行如下命令:
mysql> SET sql_safe_updates = off;
或
mysql> SET sql_safe_updates = 0;