MySQL报错之1175和1093

MySQL 中的两个常见报错:1175 报错1093 报错。这两个错误在使用 MySQL 时非常常见,但不少人遇到后不知道如何解决,今天我们就从这两个错误的根源开始,逐步分析它们的原因,并提供一些解决方法。

具体的解决报错实现场景可以参考LeetCode 196. 删除重复的电子邮箱-CSDN博客

一、MySQL 1175 错误:更新操作出错

1. 错误背景:

MySQL 的 1175 错误通常会在你执行 UPDATEDELETE 操作时发生,特别是在涉及到主键或唯一索引的情况下。错误信息大致是这样的:

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 子句
更好的方法是修改你的 UPDATEDELETE 语句,确保你有一个明确的 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 错误通常发生在执行 SELECTUPDATEDELETE 操作时,当你试图在同一个查询中 同时修改和读取同一个表。错误信息类似:

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);


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值