2011-12-22 4 views
90

Есть 2 таблицы, spawnlist и npc, и мне нужно удалить данные из spawnlsit. npc_templateid = n.idTemplate - это единственное, что «соединяет» таблицы. Я пробовал этот скрипт, но он не работает.SQL DELETE с INNER JOIN

Я попытался это:

DELETE s FROM spawnlist s 
INNER JOIN npc n ON s.npc_templateid = n.idTemplate 
WHERE (n.type = "monster"); 
+1

Был более удивлен, потому что, как правило, сообщество L2 держится. Было немного странно, хотя читал вопрос и думал: «похоже ... хм ... это!» :) – Corbin

+1

@Corbin Я полностью понимаю, что вы имеете в виду. Довольно интересно, я получаю помощь по вопросу L2 к рабочему проекту. –

ответ

156

Добавить .* в s в вашей первой линия.

Try:

DELETE s.* FROM spawnlist s 
INNER JOIN npc n ON s.npc_templateid = n.idTemplate 
WHERE (n.type = "monster"); 
+0

Вот ошибка, которую я получил: [Err] 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_t' в строке 1 [Err] DELETE l2revo .root.spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_templateid = n.idTemplate WHERE (n.type = "monster"); [Msg] Закончено - безуспешно ------------------------------------------ -------- – JoinOG

+0

В вашей ошибке похоже, что вы используете два разных имени сервера для 'spawnlist'. Я вижу 'l2revo.root.spawnlist' и' db.root.spawnlist'. – ThinkingStiff

+0

Я просто ошибаюсь, вставляя его здесь, но имя пользователя и имя db совпадают, по моей ошибке. – JoinOG

9

Если база данных InnoDB, то это может быть лучше использовать внешние ключи и каскад на удаление, это будет делать то, что вы хотите, а также привести к отсутствию избыточных данных хранится.

В этом примере, однако я не думаю, что вам нужно первые S:

DELETE s 
FROM spawnlist AS s 
INNER JOIN npc AS n ON s.npc_templateid = n.idTemplate 
WHERE n.type = "monster"; 

Это может быть лучшей идеей, чтобы выбрать строки перед удалением, так что вы уверены, что ваш удалить то, что вы хотите:

SELECT * FROM spawnlist 
INNER JOIN npc ON spawnlist.npc_templateid = npc.idTemplate 
WHERE npc.type = "monster"; 

Вы также можете проверить MySQL удалить синтаксис здесь: http://dev.mysql.com/doc/refman/5.0/en/delete.html

+0

Это ошибка, которую я получаю: [Err] 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 's INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monste" в строке 1 [Err] УДАЛИТЬ ОТ spawnlist s INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monster"; [Msg] Закончено - безуспешно ----------------- --------------------------------- – JoinOG

+0

Изменено, может быть, более успешным сейчас? – Dan

+0

Ошибка: [Err] 1066 - Не уникальный стол/псевдоним: 'НПЦ' [Err] DELETE spawnlist ОТ spawnlist, НПЦ INNER JOIN ГДЕ НПЦ spawnlist.npc_templateid = npc.idTemplate И npc.type = "монстр" ; [Msg] Закончено - безуспешно ------------------------------------------ -------- – JoinOG

4

, если база данных InnoDB вам не нужно делать присоединяется к удалению. только

DELETE FROM spawnlist WHERE spawnlist.type = "monster"; 

может быть использовано для удаления всех записей, связанных с внешними ключами в других таблицах, чтобы сделать это, Вы должны сначала связали свои таблицы во время разработки.

, если используется MyISAM вы можете удалять записи присоединиться как этот

DELETE a,b 
FROM `spawnlist` a 
JOIN `npc` b 
ON a.`npc_templateid` = b.`idTemplate` 
WHERE a.`type` = 'monster'; 

в первой строке я настроите эти два TEMP таблицы для Delet записи, во второй строке я назначили таблицу существования как для a, так и для b, но здесь я связал обе таблицы вместе с ключевым словом join, , и я сопоставил первичный и внешний ключ для обеих таблиц, которые делают ссылку, в последней строке. Я отфильтровал запись по полю для удаления.