我有一位表格讲师,我想删除工资范围在一定范围内的记录。一种直观的方式是这样的:
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);
它不会产生错误。
我的问题是:
谢谢!
到处搜寻,最流行的答案似乎是“只关闭安全模式”:
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 ...);
例外:如果对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
);
SQLFiddle演示。
所以我编写以下SQL: 但是,有一个错误: 我很困惑因为当我写的时候 null
为了保证安全的删除, Android Studio会找到被删除字符, 结果会在工具栏展示,可以在删除之前对代码进行修正。 操作步骤: 菜单栏: Refactor —> Safe Delete...
我需要允许绕过spring安全认证访问特定的控制器,但我不确定为什么spring仍然认为这些URL是受保护的……\我注意到了这个问题,因为每次我得到的是401响应 在调试模式下,我检查了restAuthenticationFilter()提供的筛选器仍在处理请求,尽管这些请求理论上是公共URL 有人能猜到我做错了什么吗? 我很感激你的帮助 我的ConfigClass 我的控制器
我是Mongo的新手,刚刚设置了我的第一个MongoDB实例/服务器。当它进入生产时,我们必须尽可能安全地运行它,所以我在安全模式下运行它。我正在尝试让备份工作。 这也是我在这个论坛上的第一个帖子。请原谅我。 1)我需要创建一个管理帐户来备份所有DBs吗?-请给出一个创建这样一个帐户的例子。2)有一种方法可以备份实例中的所有DBs吗?
我尝试删除table1中也出现在table2中的条目。code是table1和table2的主键。我使用以下查询: 但是,我得到了以下错误消息: 错误代码:1175。您正在使用安全更新模式,并且您尝试更新没有使用列的的表要禁用安全模式,请切换首选项中的选项- 但我的理解是,我已经将与列一起使用。 对此有什么建议吗?