错误代码: 1093 You can't specify target table 't_jygz_teachtask' for update in FROM clause

MYSQL执行如下语句报错:

UPDATE
  t_jygz_teachtask
SET
  completed_hours = completed_hours + 1
WHERE id =
  (SELECT
      id
    FROM
      t_jygz_teachtask
    WHERE class_bh = '4')

报错信息如下:

错误代码: 1093
You can't specify target table 't_jygz_teachtask' for update in FROM clause

意思是不能在同一语句中更新select出的同一张表元组的属性值

解决方法:将select出的结果通过中间表再select一遍即可。

UPDATE
  t_jygz_teachtask
SET
  completed_hours = completed_hours + 1
WHERE id =
  (SELECT
    id
  FROM
    (SELECT
      id
    FROM
      t_jygz_teachtask
    WHERE class_bh = '4') temp)

 

这条错误信息 "You can't specify target table 'bi_panel_data' for update in FROM clause" 通常出现在MySQL数据库操作中。它的含义是,你不能在一个UPDATE语句的FROM子句中直接引用要更新的目标表。这是MySQL的一个限制,可能是为了防止某些潜在的数据一致性问题。 MySQL不允许在同一个UPDATE或DELETE语句中使用FROM子句直接引用正在更新或删除的目标表,因为这可能会导致不确定的结果或者在并行环境下引起竞争条件。 例如,以下的SQL语句将会触发这个错误: ```sql UPDATE bi_panel_data SET value = value + 1 FROM bi_panel_data AS b WHERE b.id = bi_panel_data.id; ``` 在MySQL中,如果你需要根据表中的某些数据来更新同一个表,你可能需要使用子查询或者临时表来间接实现。 一个解决方式是使用子查询,如下: ```sql UPDATE bi_panel_data SET value = (SELECT value + 1 FROM bi_panel_data AS b WHERE b.id = bi_panel_data.id); ``` 或者使用一个临时表来存储需要更新的数据: ```sql CREATE TEMPORARY TABLE temp_update AS SELECT id, value + 1 AS new_value FROM bi_panel_data; UPDATE bi_panel_data, temp_update SET bi_panel_data.value = temp_update.new_value WHERE bi_panel_data.id = temp_update.id; DROP TEMPORARY TABLE temp_update; ``` 请注意,不同的数据库系统(如PostgreSQL, SQL Server等)可能允许这种操作,或者有各自的方法来处理这种情况,但在这个上下文中,我们讨论的是MySQL。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值