当前位置: 首页 > 面试题库 >

MYSQL更新,其中WHERE SELECT子查询错误

丁韬
2023-03-14
问题内容

我在选择要使用的子查询上遇到问题UPDATE。我正在尝试以下操作:

UPDATE foo
   SET bar=bar-1
 WHERE baz=
      (
       SELECT baz
       FROM foo
       WHERE fooID='1'
      )

foo具有主键的表名在哪里fooIDbar并且baz类型为INT。执行此操作时,出现以下错误:

Error: A query failed. You can't specify target table 'foo' for update 
in FROM clause

问题答案:

从这篇网络文章

发生此错误的原因是,当您在内部选择中还使用同一表作为更新条件时,MySQL不允许对表进行更新。本文继续提供一种解决方案,即使用临时表。

使用此示例,您的更新应为:

update foo
set bar = bar - 1
where baz in
(
  select baz from
  (
    select baz
    from foo
    where fooID = '1'
  ) as arbitraryTableName
)


 类似资料:
  • 问题内容: 谁能看到以下查询出了什么问题? 当我运行它时,我得到: #1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第8行的’a where a.CompetitionID = Competition.CompetitionID’附近使用 问题答案: 主要问题是内部查询不能与外部语句上的子句相关,因为在内部子查询执行之前,where过滤器首先应用于要

  • 我需要根据一个子查询的结果更新一个表,该子查询带来了1个以上的值,但在下面的查询中,我得到错误返回“subquery returns mouth 1 row”。我想知道是否有可能做一个“循环”,以更新值与我下面的子查询中呈现的每个结果。 完成查询 返回2个或更多值的子查询。 结果 在理想的场景中,我的查询将执行第一个值,在第二个之后...第三个之后...而不重复前面的值。

  • 问题内容: 谁能帮助我了解为什么此更新查询未更新数据库中的字段?我在我的php页面中有这个来从数据库中检索当前值: 这是我的HTML表单: 这是我的“ editblogscript”: 我不明白为什么它不起作用。 问题答案: 您必须在查询中的所有VARCHAR内容周围加上单引号。因此,您的更新查询应为: 同样,用POST中的内容直接更新数据库是一种不好的形式。您应该使用mysql_real_esc

  • 问题内容: 我在表中输入了错误的更新查询。 我忘记在子句中创建一个id字段。 这样就更新了我所有的行。 如何恢复呢? 我没有备份…。 问题答案: 抱歉,恢复被覆盖的MySQL数据库的机会通常接近零。与删除文件不同,在大多数情况下,覆盖记录实际上会物理覆盖现有数据。 为了准备好发生任何事情,您应该停止MySQL服务器,并复制包含数据库的物理目录,这样就不会进一步覆盖任何内容:只需将数据文件夹简单地复

  • 我需要更新我的数据库,它是基于locationId的多行软删除 当我运行查询时,我得到一个错误: 错误代码:1175。您使用的是安全更新模式,并且您试图更新一个没有使用键列禁用安全模式的表,请在“首选项”中切换该选项- 正如我所知,子查询将返回两条记录,因为子查询返回两条记录更新不会发生,但我如何解决这个问题。我试图解决这个问题,但没有成功。

  • 当“事件ID”与“用户ID”匹配时,im会尝试从我的“事件”表中选择所有数据。然而,我得到一个错误1242,子查询返回超过1行。 我理解我的子查询将返回多行,因为一个用户可以参加多个事件。那么我如何使我的查询接受多行呢?