Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
安全模式下的mysql删除_Mysql_Sql - Fatal编程技术网

安全模式下的mysql删除

安全模式下的mysql删除,mysql,sql,Mysql,Sql,我有一个表讲师,我想删除工资在一定范围内的记录 直观的方法如下所示: delete from instructor where salary between 13000 and 15000; 但是,在安全模式下,我不能在不提供主键(ID)的情况下删除记录 因此,我编写了以下sql: delete from instructor where ID in (select ID from instructor where salary between 13000 and 15000); 但是,有一

我有一个表讲师,我想删除工资在一定范围内的记录 直观的方法如下所示:

delete from instructor where salary between 13000 and 15000;
但是,在安全模式下,我不能在不提供主键(ID)的情况下删除记录

因此,我编写了以下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);
它不会产生错误

我的问题是:

  • 这个错误消息的真正含义是什么?为什么我的代码是错误的

  • 如何重写此代码以使其在安全模式下工作

  • 谢谢

    通过谷歌搜索,流行的答案似乎是:

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

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

    引用MySQL手册中的话:

    通常,不能修改表格并从同一表格中进行选择 在子查询中。例如,此限制适用于 以下表格:

    DELETE FROM t WHERE ... (SELECT ... FROM t ...);
    UPDATE t ... WHERE col = (SELECT ... FROM t ...);
    {INSERT|REPLACE} INTO t (SELECT ... FROM t ...);
    
    例外情况:如果在FROM子句中对修改后的表使用子查询,则上述禁止不适用。例如:

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

    .

    在Mysql workbench 6.3.4.0中关闭安全模式

    编辑菜单=>Preferences=>SQL编辑器:其他部分:单击“安全更新”。。。取消选中选项


    您可以欺骗MySQL,使其认为您实际上是在指定主键列。这允许您“覆盖”安全模式

    假设您有一个带有自动递增数字主键的表,您可以执行以下操作:

    DELETE FROM tbl WHERE id <> 0
    
    从tbl中删除,其中id为0
    
    我有一个简单得多的解决方案,它适合我;这也是一个解决办法,但可能是可用的,您不必更改您的设置。我假设您可以使用永远不存在的值,然后在WHERE子句中使用它

    从MyTable中删除,其中MyField不等于AnyValueNoItemOnMyFieldwillerHave


    我也不太喜欢这个解决方案,这就是我来这里的原因,但它很有效,而且似乎比已经回答的要好

    您想保持安全模式打开吗?您使用的是mySql workbench吗?这两个问题的答案都是肯定的。我很惊讶,当我使用jdbc删除mysql数据库中没有PK的记录时,它不会产生错误。所以安全模式只适用于mysql workbench?不,我是在问,因为如果你想在mysql workbench中关闭它,我可以告诉你怎么做。就我个人而言,我的工作与它关闭。。。必须有身份证是非常安全的-但从发展的角度来看,我发现这是一种绘画谢谢你的解释!然而,我在mysql workbench中尝试了您的代码,它仍然说“您使用的是安全更新模式,并且您试图更新一个没有使用键列的WHERE的表”。这是出乎意料的。您的主键是否使用其他名称?我注意到你的问题似乎表明它名为
    ID
    ,而我的答案使用
    ID
    。是的,我将它改为ID,但它不起作用。我尝试从ID为“1”的讲师处删除,它可以工作,因此ID是主要的key@rolandluo我知道这已经有很长时间了,但我很好奇你是否找到了解决办法。很明显,这种方法在其他情况下也有效,所以我想知道为什么你的情况不同。特定于您的服务器或版本的内容,可能是?“如何重写此代码以使其在安全模式下工作?”=>您的答案告诉您如何禁用安全模式;)对不起,我完全误解了这个问题。当我无法使用Mysql workbench从表中删除时,我发现了这个主题,Mysql workbench的注释中也有类似的问题,但我无法创建注释。我想,这将是一个很好的地方写在这里作为未来的参考。。。
    DELETE FROM tbl WHERE id <> 0