1093 - You can't specify target table 't1' for update in FROM clause
时间: 2023-12-23 15:05:58 浏览: 244
这个错误通常在 MySQL 中出现,是因为在 UPDATE 语句中使用了子查询,且子查询中包含了要更新的表,例如:
```
UPDATE t1 SET col1 = 'new_value' WHERE col2 IN (SELECT col2 FROM t1 WHERE col3 = 'value');
```
这个语句的目的是把 t1 表中 col3 等于 'value' 的行的 col1 列更新为 'new_value'。但是,由于子查询中也包含了 t1 表,所以会出现错误。
解决这个问题的方法是,使用一个临时表或者视图来代替子查询,例如:
```
CREATE VIEW v1 AS SELECT col2 FROM t1 WHERE col3 = 'value';
UPDATE t1 SET col1 = 'new_value' WHERE col2 IN (SELECT col2 FROM v1);
```
这个语句的效果与上面的语句是一样的,但是避免了子查询中包含要更新的表的问题。
相关问题
1093 - You can't specify target table 'asks_over_time' for update in FROM clause
这个错误是因为 MySQL 不允许在 UPDATE 语句中直接使用被更新的表(这里是 asks_over_time)作为子查询的源表,否则会导致死锁的风险。因此,需要对该 SQL 语句进行改写。
一种常见的方法是使用一个临时表来保存要更新的记录的主键,然后在 UPDATE 语句中引用这个临时表。具体来说,可以将子查询中的结果保存到一个临时表中,然后在 UPDATE 语句中引用这个临时表来更新 asks_over_time 表。改写后的 SQL 语句如下:
```
CREATE TEMPORARY TABLE temp_table
SELECT t1.ask_id
FROM asks t1
INNER JOIN asks_over_time t2 ON t1.ask_id = t2.ask_id
WHERE t2.is_accepted = 1 AND t1.handle_time IS NOT NULL
AND t1.handle_time != '' AND t1.handle_time >= t2.create_time;
UPDATE asks_over_time
SET is_replied = 1
WHERE ask_id IN (SELECT ask_id FROM temp_table);
DROP TEMPORARY TABLE IF EXISTS temp_table;
```
这样就可以避免出现 "You can't specify target table 'asks_over_time' for update in FROM clause" 的错误。同时,使用临时表可以提高 SQL 语句的执行效率。
1093 - You can't specify target table 'data2102011231_33391107_copy1' for update in FROM clause
这个错误通常是因为你在一个Update语句中引用了同一个表,在MySQL中是不允许这样的操作的。解决这个问题的方法是使用子查询来避免直接引用同一个表。
例如,如果你的Update语句是这样的:
```
UPDATE data2102011231_33391107_copy1 SET column1 = 'value1' WHERE column2 = 'value2' AND column3 = (SELECT MAX(column3) FROM data2102011231_33391107_copy1);
```
你可以将它改写成这样:
```
UPDATE data2102011231_33391107_copy1 SET column1 = 'value1' WHERE column2 = 'value2' AND column3 = (SELECT MAX(column3) FROM (SELECT * FROM data2102011231_33391107_copy1) AS t1);
```
这样就可以避免直接引用同一个表而产生的错误了。
阅读全文