SQL DELETE with INNER JOIN

Są 2 tabele, spawnlist i npc, i muszę usunąć dane z spawnlsit. npc_templateid = n.idTemplate jest jedyną rzeczą, która "łączy" tabele. Próbowałem tego skryptu, ale nie działa.

Próbowałem tego:

DELETE s FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
Author: Sam, 2011-12-22

3 answers

Dodaj .* do s w pierwszej linijce.

Try:

DELETE s.* FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
 234
Author: ThinkingStiff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-22 19:05:20

Jeśli baza danych jest InnoDB, to może być lepszym pomysłem, aby użyć kluczy obcych i kaskadowych na delete, to zrobi to, co chcesz, a także skutkować nie redundantne dane są przechowywane.

Do tego przykładu jednak chyba nie potrzebujesz pierwszych s:

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

Lepszym pomysłem może być zaznaczenie wierszy przed usunięciem, więc na pewno usuniesz to, co chcesz:

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

Możesz również sprawdzić składnię usuwania MySQL tutaj: http://dev.mysql.com/doc/refman/5.0/en/delete.html

 12
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-22 03:10:59

Jeśli baza danych jest InnoDB, nie musisz robić złączeń w usuwaniu. tylko

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

Może być użyty do usunięcia wszystkich rekordów, które połączyły się z kluczami obcymi w innych tabelach, aby to zrobić, musisz najpierw połączyć swoje tabele w czasie projektowania.

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;

Jeśli używasz MyISAM możesz usunąć rekordy łączące się w ten sposób

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

W pierwszej linii zainicjowałem dwie tabele temp do usunięcia rekordu, w drugiej linijce przypisałem tabelę existance zarówno do a jak i b ale tutaj i połączył obie tabele ze słowem kluczowym join, i dopasowałem klucz podstawowy i obcy dla obu tabel, które tworzą link, w ostatniej linii mam filtrowane rekord przez pole do usunięcia.

 6
Author: Aylian Craspa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-18 07:23:28