subquery - MySQL Error 1093 - Can't specify target table for update in FROM clause -
i have table story_category
in database corrupt entries. next query returns corrupt entries:
select * story_category category_id not in ( select distinct category.id category inner join story_category on category_id=category.id);
i tried delete them executing:
delete story_category category_id not in ( select distinct category.id category inner join story_category on category_id=category.id);
but next error:
#1093 - can't specify target table 'story_category' update in clause
how can overcome this?
update: answer covers general error classification. more specific answer how best handle op's exact query, please see other answers question
in mysql, can't modify same table use in select part.
behaviour documented at: http://dev.mysql.com/doc/refman/5.6/en/update.html
maybe can join table itself
if logic simple enough re-shape query, lose subquery , join table itself, employing appropriate selection criteria. cause mysql see table 2 different things, allowing destructive changes go ahead.
update tbl inner join tbl b on .... set a.col = b.col
alternatively, try nesting subquery deeper clause ...
if absolutely need subquery, there's workaround, it's ugly several reasons, including performance:
update tbl set col = ( select ... (select.... from) x);
the nested subquery in clause creates implicit temporary table, doesn't count same table you're updating.
... watch out query optimiser
however, beware mysql 5.7.6 , onward, optimiser may optimise out subquery, , still give error. luckily, optimizer_switch
variable can used switch off behaviour; although couldn't recommend doing more short term fix, or small one-off tasks.
set optimizer_switch = 'derived_merge=off';
thanks peter v. mørch advice in comments.
example technique baron schwartz, originally published @ nabble, paraphrased , extended here.
Comments
Post a Comment