MySQL 中的两个常见报错:1175 报错和1093 报错。这两个错误在使用 MySQL 时非常常见,但不少人遇到后不知道如何解决,今天我们就从这两个错误的根源开始,逐步分析它们的原因,并提供一些解决方法。
具体的解决报错实现场景可以参考LeetCode 196. 删除重复的电子邮箱-CSDN博客
一、MySQL 1175 错误:更新操作出错
1. 错误背景:
MySQL 的 1175 错误通常会在你执行 UPDATE
或 DELETE
操作时发生,特别是在涉及到主键或唯一索引的情况下。错误信息大致是这样的:
ERROR 1175 (HY000): 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)下,系统会防止执行没有明确过滤条件的更新操作,特别是没有用索引列作为 WHERE
条件的更新或删除操作。
2. 解决方法:
(1) 禁用安全更新模式(不推荐,但可行)
你可以临时禁用安全更新模式,来绕过这个限制。可以在 MySQL 命令行执行以下命令:
SET SQL_SAFE_UPDATES = 0;
(2) 添加合适的 WHERE
子句
更好的方法是修改你的 UPDATE
或 DELETE
语句,确保你有一个明确的 WHERE
条件,并且这个条件最好是基于索引列。例如:
UPDATE users SET status = 'inactive' WHERE user_id = 101;
确保 user_id
是索引列,这样就符合安全更新模式的要求。
(3) 永久禁用安全更新模式
如果你希望永久禁用安全更新模式,可以修改 MySQL 配置文件 my.cnf
,在 [mysqld]
部分加入:
sql_safe_updates = 0
然后重启 MySQL 服务使其生效。
二、MySQL 1093 错误:在同一查询中修改和读取同一表
1. 错误背景:
1093 错误通常发生在执行 SELECT
、UPDATE
或 DELETE
操作时,当你试图在同一个查询中 同时修改和读取同一个表。错误信息类似:
ERROR 1093 (HY000): You can't specify target table 'table_name' for update in FROM clause
2. 解决方法:
(1)使用临时表
你可以通过创建一个临时表来避免这个问题。比如,如果你需要更新一个表的数据,并且需要基于该表的数据进行计算,可以先将表的数据复制到临时表中,再对临时表进行操作。例如:
CREATE TEMPORARY TABLE temp_table AS SELECT * FROM users WHERE status = 'active';
UPDATE users u
JOIN temp_table t ON u.user_id = t.user_id
SET u.status = 'inactive';
DROP TEMPORARY TABLE temp_table;
(2)嵌套一层查询
delete from Person where id not in
(select * from (select min(t1.id)
from Person as t1
group by t1.email) a);