当前位置: 首页 > 知识库问答 >
问题:

安全模式下删除mysql

俞子实
2023-03-14
delete from instructor where salary between 13000 and 15000;

所以我编写以下SQL:

delete from instructor where ID in (select ID from instructor where salary between 13000 and 15000);

但是,有一个错误:

You can't specify target table 'instructor' for update in FROM clause

我很困惑因为当我写的时候

select * from instructor where ID in (select ID from instructor where salary between 13000 and 15000);
    null

共有1个答案

权韬
2023-03-14

谷歌一下,流行的答案似乎是“关闭安全模式就行了”:

SET SQL_SAFE_UPDATES = 0;
DELETE FROM instructor WHERE salary BETWEEN 13000 AND 15000;
SET SQL_SAFE_UPDATES = 1;

如果我是诚实的,我不能说我曾经养成过在安全模式下运行的习惯。不过,我对这个答案并不完全满意,因为它只是假设每次遇到问题时都应该更改数据库配置。

因此,您的第二个查询更接近目标,但遇到了另一个问题:MySQL对子查询应用了一些限制,其中之一是在子查询中选择表时不能修改表。

引用MySQL手册中对子查询的限制:

通常情况下,您不能在子查询中修改表并从同一表中进行选择。例如,此限制适用于以下形式的语句:

DELETE FROM t WHERE ... (SELECT ... FROM t ...);
UPDATE t ... WHERE col = (SELECT ... FROM t ...);
{INSERT|REPLACE} INTO t (SELECT ... FROM t ...);
UPDATE t ... WHERE col = (SELECT * FROM (SELECT ... FROM t...) AS _t ...);

这里,from子句中的子查询的结果存储为临时表,因此在对t进行更新时,t中的相关行已经被选择。

最后一点就是你的答案。在临时表中选择目标ID,然后通过引用该表中的ID进行删除:

DELETE FROM instructor WHERE id IN (
  SELECT temp.id FROM (
    SELECT id FROM instructor WHERE salary BETWEEN 13000 AND 15000
  ) AS temp
);

SQLFiddle演示。

 类似资料:
  • 问题内容: 我有一位表格讲师,我想删除工资范围在一定范围内的记录。一种直观的方式是这样的: 但是,在安全模式下,如果不提供主键(ID),则无法删除记录。 所以我写下面的sql: 但是,有一个错误: 我很困惑,因为当我写 它不会产生错误。 我的问题是: 此错误消息的真正含义是什么,为什么我的代码是错误的? 如何重写此代码以使其在安全模式下工作? 谢谢! 问题答案: 到处搜寻,最流行的答案似乎是“只关

  • 为了保证安全的删除, Android Studio会找到被删除字符, 结果会在工具栏展示,可以在删除之前对代码进行修正。 操作步骤: 菜单栏: Refactor —> Safe Delete...

  • 我需要允许绕过spring安全认证访问特定的控制器,但我不确定为什么spring仍然认为这些URL是受保护的……\我注意到了这个问题,因为每次我得到的是401响应 在调试模式下,我检查了restAuthenticationFilter()提供的筛选器仍在处理请求,尽管这些请求理论上是公共URL 有人能猜到我做错了什么吗? 我很感激你的帮助 我的ConfigClass 我的控制器

  • 我尝试删除table1中也出现在table2中的条目。code是table1和table2的主键。我使用以下查询: 但是,我得到了以下错误消息: 错误代码:1175。您正在使用安全更新模式,并且您尝试更新没有使用列的的表要禁用安全模式,请切换首选项中的选项- 但我的理解是,我已经将与列一起使用。 对此有什么建议吗?

  • 8.5. 安全模式 PHP的safe_mode选项的目的是为了解决本章所述的某些问题。但是,在PHP层面上去解决这类问题从架构上来看是不正确的,正如PHP手册所述(http://php.net/features.safe-mode)。 当安全模式生效时,PHP会对正在执行的脚本所读取(或所操作)文件的属主进行检查,以保证与该脚本的属主是相同的。虽然这样确实可以防范本章中的很多例子,但它不会影响其它