安全模式下的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