2016-09-05 2 views
0

У меня есть база данных, содержащая существ из игры.Вы не можете указать целевую таблицу «существо» для обновления в предложении FROM

2 таблицы:

«creature_template», содержащая все данные, относящиеся к существам

«существа», содержащего информацию о местоположении существ в игре.

Вот код:

DELETE FROM 
    creature 
    WHERE 
    id not in 
    (SELECT DISTINCT 
    b.id 
    FROM 
    creature_template a inner join creature b on a.entry = b.id 
    WHERE 
    b.map != 571 
    AND a.`type` = 1 
    AND a.`type` = 10 
    ); 

Тип является тип существа (1 = зверь, 10 = не определено)

То, что я хочу сделать, это удалить все существа, находятся на карте № 571 и не являются животными (тип = 1) или не указаны (тип = 10).

Столбец «карта» находится в таблице «существо», а столбец «type» находится в таблице «creature_template».

Каждое существо в игре идентифицируется в базе данных идентификатором. В таблице «существо» есть столбец с именем «id», который содержит эти идентификаторы, а эквивалент в таблице «creature_template» - столбец «запись».

Так что я должен сделать, это выбрать все существа, которые находятся на карте # 571, а затем исключить все типы 1 и 10 и удалить остальные.

Проблема заключается в том, что, когда я выполняю код выше, я получаю ошибку говоря «Вы не можете указать целевую таблицу„существа“для обновления в ЕКЕ»

Я сделал несколько исследований здесь, на StackOverflow и попробовал несколько решений, которые я нашел.

... В итоге я удалил все данные из таблицы «существо». К счастью, я получил данные из резервной копии, которую я сделал вчера.

Любая идея, как решить мою проблему?

+1

Если вам нравится, рассмотрите следующий простой двухэтапный курс действий: 1. Если вы еще этого не сделали, предоставьте правильные инструкции CREATE и INSERT (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему , 2. Если вы еще этого не сделали, укажите желаемый набор результатов, соответствующий информации, представленной на шаге 1. – Strawberry

ответ

0

Использование «имени подзапрос хак»:

DELETE FROM 
    creature 
    WHERE 
    id not in 
    (
    SELECT id FROM 
     (
     SELECT DISTINCT b.id 
     FROM creature_template a inner join creature b on a.entry = b.id 
     WHERE b.map != 571 AND a.`type` = 1 AND a.`type` = 10 
    ) A 
    ); 
+0

Нет. Я просто попробовал ваше решение и удалил все данные в таблице «существо». :/ К счастью у меня есть резервная копия – NZoth

+1

@NZoth Ваше состояние, вероятно, не выбрано ни одной записи. И 'id not in()' выберите все для удаления. Сначала проверьте любой запрос на удаление. – Mike

0

Одной из возможностей является INSERT INTO a temp table использованием SELECT, который извлекает из creature строки, которые вы хотите удалить или строки, которые вы хотите сохранить (таблица температуры просто необходимо содержат столбцы PK), а в WHERE подзапроса вашего оператора DELETE просто используйте таблицу temp.

Просто, чтобы показать концепцию, не проверял:

SELECT DISTINCT 
    b.id 
    INTO #TempRowsToKeep 
    FROM 
    creature_template a inner join creature b on a.entry = b.id 
    WHERE 
    b.map != 571 
    AND (a.`type` = 1 or a.`type` = 10); 

DELETE FROM 
    creature 
    WHERE 
    id not in 
     (SELECT id FROM #TempRowsToKeep); 

DROP TABLE #TempRowsToKeep; 

Я не MySQl эксперт, но если решение от ответа Майка работает, я думаю, вы должны пойти на этот один, так как она не включает в себя временная таблица, и это всего лишь один оператор вместо 3. Тот факт, что когда вы его попробовали, он удалил все ваши строки, чтобы предположить, что ваше условие в самом внутреннем запросе не выбрало ни одной строки, как он упомянул. Фактически в нем есть ошибка, которая, несомненно, вызвала это:

AND a.`type` = 1 AND a.`type` = 10 

всегда будет ложным.Вероятно, это должно быть

AND (a.`type` = 1 or a.`type` = 10) 

В моем коде выше указанная коррекция, если вы используете ее, сначала проверьте ее.

+0

У вас есть пример кода для «и в WHERE подзапроса вашего оператора DELETE просто используйте таблицу temp». часть? – NZoth

+0

@NZoth Смотрите мое редактирование. Независимо от того, как общее предложение, не позволяйте вашему восстановлению неохотно удаленных строк «повезло»; либо проверьте условие DELETE с помощью 'SELECT' сначала, как рекомендовал Майк, или систематически сделайте резервную копию перед каждой попыткой. – SantiBailors

Смежные вопросы

 Смежные вопросы