MySQL обойти ошибку 1093 - PullRequest
       43

MySQL обойти ошибку 1093

4 голосов
/ 19 декабря 2010

Ошибка 1093 утверждает, что вы не можете ОБНОВИТЬ или УДАЛИТЬ, используя подзапрос, если ваш подзапрос запрашивает таблицу, из которой вы удаляете.

Так что вы не можете сделать

delete from table1 where id in (select something from table1 where condition) ;

Хорошо, как лучше обойти это ограничение (если вы действительно нуждаетесь в подзапросе, чтобы выполнить удаление, и не можете полностью удалить самоссылающийся подзапрос?)

Edit:

Вот запрос для тех, кому интересно:

mysql> desc adjacencies ;
+---------+---------+------+-----+---------+-------+
| Field   | Type    | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+-------+
| parent  | int(11) | NO   | PRI | NULL    |       |
| child   | int(11) | NO   | PRI | NULL    |       |
| pathLen | int(11) | NO   |     | NULL    |       |
+---------+---------+------+-----+---------+-------+



-- The query is going to
-- tell all my children to
-- stop thinking my old parents
-- are still their parents

delete from adjacencies
where parent in 
(
-- ALL MY PARENTS,grandparents
  select parent
  from adjacencies
  where child=@me
  and parent!=@me
)

-- only concerns the relations of my
-- grandparents WHERE MY CHILDREN ARE CONCERNED
and child in
(
  -- get all my children
  select child
  from adjacencies
  where parent=@me
)

;

Итак, я попробовал создать временную таблицу с именем adjsToDelete

create temporary table adjsToRemove( parent int, child int ) ;
insert into adjsToRemove...

Так что теперь у меня есть коллекция отношений для удаления, где каждая из родительских / дочерних пар однозначно идентифицирует строку для удаления. Но как мне теперь удалить каждую пару из таблицы смежностей?

Кажется, мне нужно добавить уникальный ключ auto_increment к каждой записи в adjacencies, верно?

Ответы [ 5 ]

7 голосов
/ 21 марта 2013

Обходной путь, найденный в http://bugs.mysql.com/bug.php?id=6980,, который работал для меня, заключается в создании псевдонима подзапроса, который будет возвращать элементы. Так

delete from table1 where id in 
  (select something from table1 where condition)

будет изменено на

delete from table1 where id in
  (select p.id from (select something from table1 where condition) as p)
2 голосов
/ 19 декабря 2010

Вы можете сделать

delete t1,t2 
FROM  table1 t1  
INNER JOIN 
table1 t2 ON (t2.something = t1.id);

Для запроса в вопросе это должно быть эквивалентно:

delete A
from adjacencies A
join adjacencies B ON A.parent = B.parent AND B.child=@me AND B.parent != @me
join adjacencies C ON A.child = C.child AND C.parent=@me
1 голос
/ 12 марта 2013

Упрощенно:

-- Collect ids
CREATE TEMPORARY TABLE cleanup_lookup AS 
SELECT id FROM table1 WHERE condition;

-- Delete the selected records
DELETE t FROM table1 t INNER JOIN cleanup_lookup l ON t.id = l.id;

-- Temporary tables get dropped when the connection is closed.
1 голос
/ 20 декабря 2010

Currently, you cannot delete from a table and select from the same table in a subquery - подробности

Вы просто не можете не можете указать целевую таблицу для удаления

один из моих решений: MySQLУДАЛИТЬ ИЗ с подзапросом как условие

0 голосов
/ 16 сентября 2017

Вы можете использовать его без колебаний.

Ваш запрос:

delete from table1 
where id in (select something from table1 where condition);

Обновленный запрос:

DELETE FROM table1 
WHERE id IN (SELECT * 
             FROM 
                 (SELECT MIN(id) FROM table1 GROUP BY Column2) x);

Здесь Column2 - это столбец, в котором выхочу найти дубликаты записей.

...