mysql 错误 1093 - You can't specify target table 'user_list_log' for update in FROM clause 查找更新失败 update delete
你在哭吗? 没有,我只是过敏了。 对什么过敏? 人生。
在执行mysql 删除脚本的时候,出现了意向不到的错误
场景:
在user_list_log 表中,由于前端代码不严谨出现了重复数据,于是就想着用mysql脚本执行mysql语句进行删除掉 id 比较小的多余数据,所以按照思路就写着就出现如下mysql语句
SELECT
min( id ) AS id
FROM
`user_list_log`
WHERE
platform_id = 5
AND type = 'sale_price'
GROUP BY
online_id,
variants_id
HAVING
count( * ) > 1
先找出 重复数据,然后再进行用 主键id in 进行执行删除
DELETE
FROM
`user_list_log`
WHERE
id IN (
SELECT
min( id ) AS id
FROM
`user_list_log`
WHERE
platform_id = 5
AND `status` = 1
GROUP BY
online_id,
variants_id
HAVING
count( * ) > 1
);
然后就出现 标题所示问题,思路上是没问题的,但是就是执行失败,于是网站搜索了一下,
在子查询再加一层查询,就可以了,执行mysql 如下
DELETE
FROM
`user_list_log`
WHERE
id IN (
SELECT
a.id
FROM
(
SELECT
min( id ) AS id
FROM
`pdvee_online_batch_shopee`
WHERE
platform_id = 5
AND type = 'sale_price'
GROUP BY
online_id,
variants_id
HAVING
count( * ) > 1
) AS a
);
这样的就没有问题了
update 语句也是一样的
UPDATE `user_list_log`
SET `status` = 1
WHERE
id IN (
SELECT
a.id
FROM
( SELECT id FROM `user_list_log` WHERE type = 'sale_price' AND `status` = 3 AND update_time > '2022-10-12 00:00:00' AND update_time < '2022-10-12 14:30:00' ) AS a
);
原因:
翻找了对应的手册,mysql 中有说明,在执行 delete 或者 update 的时候,目标表不能在其直接子查询中存在,需要在子查询中给目标表起个别名