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");
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");
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
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.
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