SQL DELETE с INNER JOIN


120

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

Я пробовал это:

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

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

1
@ Корбин, я прекрасно понимаю, что ты имеешь в виду. Достаточно интересно, я получаю помощь по вопросу L2 для рабочего проекта.
Марко Аурелио Делеу,

Удалить из таблицы1 из таблицы1 t1 внутреннего соединения table2 t2 на t1.id = t2.id; подробнее youtu.be/_tyUVrS2iH4
Амреш Кумар Сингх

Ответы:


225

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

Пытаться:

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

Вот полученная мной ошибка: [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 ИЗ db.root.spawnlist s ВНУТРЕННЕЕ СОЕДИНЕНИЕ db.root.npc n ON s.npc_templateid = n.idTemplate WHERE (n.type = "monster"); [Msg] Завершено - неудачно -------------------------------------------- ------
JoinOG

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

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

Попробуйте добавить ASдля своих псевдонимов.
ThinkingStiff

4
@GauravRamanan s. * Сообщает mysql, что УДАЛИТЬ, вы не хотите удалять строки из таблицы
JOINED

12

Если база данных - это 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


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

Поменял, может теперь будет удачнее?
Дэн

Ошибка: [Err] 1066 - Не уникальная таблица / псевдоним: 'npc' [Err] УДАЛИТЬ список респаунлистов ИЗ списка спауннов, npc ВНУТРЕННЕЕ СОЕДИНЕНИЕ npc ГДЕ spawnlist.npc_templateid = npc.idTemplate И npc.type = "monster"; [Msg] Завершено - неудачно -------------------------------------------- ------
JoinOG

Если вы просто собираетесь запустить его один раз, вы можете запустить ужасно неэффективное: УДАЛИТЬ ИЗ spawnlist WHERE npc_templateid IN (SELECT idTemplate from npc WHERE type = "monster");
Corbin

Это моя последняя попытка, если вы удаляете только одну таблицу при объединении, я не понимаю, почему это не сработает.
Дэн

6

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

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

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

CREATE TABLE IF NOT EXIST spawnlist (
  npc_templateid VARCHAR(20) NOT NULL PRIMARY KEY

)ENGINE=InnoDB;

CREATE TABLE IF NOT EXIST npc (
  idTemplate VARCHAR(20) NOT NULL,

  FOREIGN KEY (idTemplate) REFERENCES spawnlist(npc_templateid) ON DELETE CASCADE

)ENGINE=InnoDB;

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

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

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


typeфактически находится в другой таблице, а не в spawnlistтаблице, поэтому необходимо присоединиться
vitro
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.