SQL DELETE con INNER JOIN

120

Hay 2 tablas spawnlisty npc, y necesito eliminar datos de spawnlsit. npc_templateid = n.idTemplatees lo único que "conecta" las tablas. He probado este script pero no funciona.

He probado esto:

DELETE s FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
JoinOG
fuente
1
Me sorprendió más porque, por lo general, la comunidad L2 se mantiene sola. Fue un poco extraño leer la pregunta y pensar "eso parece ... hmm ... ¡lo es!" :)
Corbin
1
@Corbin Entiendo totalmente lo que quieres decir. Lo suficientemente interesante, estoy recibiendo ayuda en una pregunta L2 para un proyecto de trabajo.
Marco Aurélio Deleu
Eliminar de table1 de table1 t1 combinación interna table2 t2 en t1.id = t2.id; en detalles youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Respuestas:

224

Agregue .*a sen su primera línea.

Tratar:

DELETE s.* FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
Pensando rígido
fuente
Aquí está el error que recibí: [Err] 1064 - Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para ver 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"); [Msj] Terminado - Sin éxito -------------------------------------------- ------
JoinOG
En su error, parece que está utilizando dos nombres de servidor diferentes para spawnlist. Veo l2revo.root.spawnlisty db.root.spawnlist.
ThinkingStiff
Solo cometo un error al pegarlo aquí, pero el nombre de usuario y el nombre de la base de datos son los mismos, por mi error.
JoinOG
Intente agregar ASsus alias.
ThinkingStiff
4
@GauravRamanan the s. * Le dice a mysql qué ELIMINAR, no desea eliminar filas de la tabla
JOINED
12

Si la base de datos es InnoDB, entonces podría ser una mejor idea usar claves externas y eliminar en cascada, esto haría lo que desea y también resultará en que no se almacenen datos redundantes.

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

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 seleccionar las filas antes de eliminar para estar seguro de que está eliminando lo que desea:

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

También puede consultar la sintaxis de eliminación de MySQL aquí: http://dev.mysql.com/doc/refman/5.0/en/delete.html

Dan
fuente
Este es el error que obtengo: [Err] 1064 - Tiene un error en su sintaxis SQL; compruebe el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar near 's INNER JOIN npc n ON s.npc_templateid = n.idTemplate DONDE n.type = "monste' en la línea 1 [Err] DELETE FROM spawnlist s INNER ÚNETE a npc n ON s.npc_templateid = n.idTemplate DONDE n.type = "monster"; [Msg] Terminado - Sin éxito ------------------------ --------------------------
JoinOG
Cambiado, ¿podría tener más éxito ahora?
Dan
Error: [Err] 1066 - Tabla / alias no único: 'npc' [Err] BORRAR spawnlist FROM spawnlist, npc INNER JOIN npc WHERE spawnlist.npc_templateid = npc.idTemplate AND npc.type = "monstruo"; [Msj] Terminado - Sin éxito -------------------------------------------- ------
JoinOG
Si solo va a ejecutarlo una vez, podría ejecutar lo horriblemente ineficiente: DELETE FROM spawnlist WHERE npc_templateid IN (SELECT idTemplate from npc WHERE type = "monster");
Corbin
Ese es mi último intento, si elimina de una sola tabla en una combinación, no puedo ver por qué eso no funcionará.
Dan
6

si la base de datos es InnoDB, no es necesario realizar uniones en la eliminación. solamente

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

se puede usar para eliminar todos los registros que se vincularon con claves externas en otras tablas, para hacer eso, primero debe vincular sus tablas en tiempo de diseño.

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 usa MyISAM, puede eliminar registros que se unen así

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

en la primera línea he inicializado las dos tablas temporales para borrar el registro, en la segunda línea he asignado la tabla de existencia tanto a a como a b, pero aquí he vinculado ambas tablas con la palabra clave join, y he hecho coincidir la clave principal y externa para ambas tablas que hacen el enlace, en la última línea he filtrado el registro por campo para borrar.

Aylian Craspa
fuente
typeen realidad está en la otra tabla, no en la spawnlisttabla, por lo que la unión es necesaria
vitro