117 votes

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é :

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

215voto

ThinkingStiff Points 19251

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

Essayez :

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

12voto

Silver89 Points 1296

Si la base de données est InnoDB, il serait peut-être préférable d'utiliser des clés étrangères et de procéder à une cascade lors de la suppression, ce qui permettrait d'obtenir ce que vous souhaitez et d'éviter le stockage de données redondantes.

Pour cet exemple cependant, je ne pense pas que vous ayez besoin du premier 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 afin d'ê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 consulter la syntaxe de suppression de MySQL ici : http://dev.mysql.com/doc/refman/5.0/en/delete.html

6voto

Aylian Craspa Points 21

Si la base de données est InnoDB, vous n'avez pas besoin de faire des jointures dans 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 lors 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 les enregistrements en les joignant comme ceci

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

Dans la première ligne, j'ai initialisé les deux tables temporaires pour supprimer l'enregistrement, dans la deuxième ligne j'ai assigné la table d'existence à la fois à a et à b mais ici j'ai lié les deux tables ensemble avec le mot-clé join, et j'ai fait correspondre la clé primaire et étrangère pour les deux tables qui font le lien, dans la dernière ligne, j'ai filtré l'enregistrement par champ à supprimer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X