web-dev-qa-db-fra.com

SQL DELETE avec INNER JOIN

Il y a 2 tables, spawnlist et npc, et je dois supprimer les données de spawnlsit. npc_templateid = n.idTemplate est la seule chose qui "connecte" les tables. J'ai essayé ce script mais ça ne marche pas.

J'ai essayé ceci:

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

Ajoutez .* à s dans votre première ligne.

Essayer:

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

Si la base de données est InnoDB, il serait peut-être préférable d'utiliser des clés étrangères et une cascade lors de la suppression. Cela ferait ce que vous voudriez et éviterait également le stockage de données redondantes.

Pour cet exemple cependant, je ne pense pas que vous ayez besoin des premiers s:

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

Il serait peut-être préférable de sélectionner les lignes avant de les supprimer pour être sûr de supprimer ce que vous souhaitez:

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

Vous pouvez également vérifier la syntaxe de suppression de MySQL ici: http://dev.mysql.com/doc/refman/5.0/en/delete.html

11
Dan

si la base de données est InnoDB, vous n'avez pas besoin de faire des jointures lors de la suppression. seulement

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

peut être utilisé pour supprimer tous les enregistrements liés à des clés étrangères dans d'autres tables. Pour ce faire, vous devez d'abord lier vos tables au moment de la conception.

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;

si vous utilisez MyISAM, vous pouvez supprimer des enregistrements rejoignant comme ceci

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

en première ligne, j'ai initialisé les deux tables temporaires pour supprimer l'enregistrement, en deuxième ligne, j'ai affecté la table d'existence à a et b, mais ici, j'ai lié les deux tables avec un mot-clé join, et j'ai mis en correspondance la clé primaire et la clé étrangère pour les deux tables qui font un lien, dans la dernière ligne, j'ai filtré l'enregistrement par champ à supprimer.

6
Aylian Craspa