2011-12-22 16 views
90

Hay 2 tablas, spawnlist y npc, y necesito eliminar datos de spawnlsit. npc_templateid = n.idTemplate es lo único que "conecta" las tablas. He intentado este script pero no funciona.SQL DELETE con INNER JOIN

He intentado esto:

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

Estaba más sorprendido porque normalmente la comunidad L2 se mantiene a sí misma. Fue un poco extraño a pesar de leer la pregunta y pensar "eso parece ... hmm ... ¡lo es!" :) – Corbin

+1

@Corbin Entiendo totalmente lo que quieres decir. Es bastante interesante, estoy recibiendo ayuda en una pregunta L2 para un proyecto de trabajo. –

Respuesta

156

Añadir .*-s en su primera línea.

Probar:

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

Aquí está el error que obtuve: [Err] 1064 - Tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de 'spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_t' en la línea 1 [Err] DELETE l2revo .root.spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_templateid = n.idTemplate WHERE (n.type = "monstruo"); [Msg] Finalizado - Sin éxito ------------------------------------------ -------- – JoinOG

+0

En su error, parece que está utilizando dos nombres de servidor diferentes para 'spawnlist'. Veo 'l2revo.root.spawnlist' y' db.root.spawnlist'. – ThinkingStiff

+0

me equivoco al pegarlo aquí, pero el nombre de usuario y el nombre de db son los mismos, a mi error. – JoinOG

9

Si la base de datos es InnoDB entonces podría ser una idea mejor utilizar las claves externas y cascada de borrar, esto sería hacer lo que quiere y también como resultado no hay datos redundantes siendo almacenado.

Para este ejemplo, sin embargo, no creo que necesite los primeros s:

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

Podría ser una mejor idea para seleccionar las filas antes de eliminar lo que está seguro de su eliminación de lo que quieren:

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

también puede comprobar la sintaxis de MySQL borrar aquí: http://dev.mysql.com/doc/refman/5.0/en/delete.html

+0

Este es el error que obtengo: [Err] 1064 - Tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de JUNTA INTERNA npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monste" en la línea 1 [Err] BORRAR DE spawnlist s INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monstruo"; [Msg] Finalizado - Sin éxito ----------------- --------------------------------- – JoinOG

+0

Cambiado, ¿podría tener más éxito ahora? – Dan

+0

error: [Err] 1066 - mesa no es único/alias: 'NPC' [Err] BORRAR DE spawnlist spawnlist, NPC INNER JOIN NPC DONDE spawnlist.npc_templateid = npc.idTemplate Y npc.type = "monstruo" ; [Msg] Finalizado - Sin éxito ------------------------------------------ -------- – JoinOG

4

si la base de datos InnoDB es que no necesita hacer une a la eliminación. Sólo

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

se puede utilizar para eliminar los registros de todos los que unían con claves externas de otras tablas, para hacer que usted tiene que primero vinculado sus tablas en tiempo de diseño.

si utiliza MyISAM puede eliminar registros de unirse como esto

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

en primera línea he inicializado las dos tablas temporales para borrado del registro, en segunda línea que he asignado la mesa existencia aa y b pero aquí he vinculado ambas tablas junto con la palabra clave join, y he encontrado la clave primaria y externa para ambas tablas que hacen link, en la última línea he filtrado el registro por campo para eliminar.