MySQL | 无法在FROM子句中指定更新的目标表'a'

26 浏览
0 Comments

MySQL | 无法在FROM子句中指定更新的目标表'a'

我想让MySQL执行这个(简化版的)查询。在stackoverflow的其他页面上,我了解到这是不支持的,可以通过使用JOINS来解决。如何使用JOINS来“转录”这个查询?我觉得很难做到,因为我从未尝试过创建包含多个表的DELETE查询。

0
0 Comments

MySQL中出现"You can't specify target table 'a' for update in FROM clause"的原因是在UPDATE语句中指定了目标表作为FROM子句中的一部分。这个问题通常发生在使用子查询更新表中的行时。

解决这个问题的方法有两种:

1. 使用临时表:将需要更新的数据先插入到一个临时表中,然后再通过子查询从临时表中更新目标表。以下是一个示例代码:

CREATE TEMPORARY TABLE temp_table

SELECT a.id

FROM table_a AS a

INNER JOIN table_b AS b

ON b.code = a.code

AND b.id = a.b_id

WHERE a.object_id = 1

AND a.code = 'code'

AND b.`table` = 'testTable';

UPDATE table_a

SET column = value

WHERE id IN (SELECT id FROM temp_table);

2. 使用嵌套子查询:将目标表的更新操作嵌套在另一个子查询中,以避免直接在FROM子句中指定目标表。以下是一个示例代码:

UPDATE table_a

SET column = value

WHERE id IN (

SELECT a.id

FROM table_a AS a

INNER JOIN table_b AS b

ON b.code = a.code

AND b.id = a.b_id

WHERE a.object_id = 1

AND a.code = 'code'

AND b.`table` = 'testTable'

);

通过使用临时表或嵌套子查询的方式,可以解决MySQL中出现"You can't specify target table 'a' for update in FROM clause"的问题。

0
0 Comments

MySQL中的一个限制是,你不能在一个子查询中删除一个表并引用同一个表。下面是一个可以解决这个问题的例子:

DELETE FROM table_a 
USING table_a
INNER JOIN table_b
    ON table_a.code = table_b.code
    AND table_b.id = table_a.b_id
    AND table_b.table = 'testTable'
WHERE table_a.object_id = 1 
    AND table_a.code = 'code' 

重要的部分是USING。如果只是简单地将两个表连接起来,你会从两个表中删除记录。USING告诉MySQL使用这些表进行处理,但只从FROM子句中的表中删除记录。

更多信息请参考https://dev.mysql.com/doc/refman/5.0/en/delete.html

0
0 Comments

这是一个常见的MySQL问题,解决方法是在select语句和update/delete语句之间使用临时表。

出现这个问题的原因是MySQL不允许在FROM子句中直接引用目标表进行更新操作。

下面是一个示例的解决方法:

DELETE FROM table_a WHERE id IN

(select id from

(SELECT table_a.id AS id FROM table_a, table_b

WHERE table_a.object_id = 1

AND table_a.code = 'code'

AND table_a.code = table_b.code

AND table_b.id = table_a.b_id

AND table_b.table = 'testTable')

) tempTable

在上面的代码中,我们通过将内部查询的结果存储在一个临时表tempTable中,然后再使用这个临时表进行删除操作,从而避免了直接引用目标表的问题。

通过使用临时表,我们可以绕过MySQL的限制,成功执行更新操作。希望这个解决方法对你有帮助!

0