УДАЛИТЬ SQL с ВНУТРЕННИМ СОЕДИНЕНИЕМ - PullRequest
112 голосов
/ 22 декабря 2011

Есть 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");

Ответы [ 3 ]

202 голосов
/ 22 декабря 2011

Добавьте .* к s в первой строке.

Попытка:

DELETE s.* FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
11 голосов
/ 22 декабря 2011

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

6 голосов
/ 18 февраля 2013

если база данных 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, и я сопоставил первичный и внешний ключ для обеих таблиц, которые делают ссылку, в последней строке я отфильтровал запись по полю для удаления.

...