it-swarm.com.de

SQL DELETE mit INNER JOIN

Es gibt 2 Tabellen, spawnlist und npc, und ich muss Daten aus spawnlsit löschen. npc_templateid = n.idTemplate ist das einzige, was die Tabellen "verbindet". Ich habe dieses Skript ausprobiert, aber es funktioniert nicht.

Ich habe das versucht:

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

Hinzufügen .* bis s in Ihrer ersten Zeile.

Versuchen:

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

Wenn es sich bei der Datenbank um InnoDB handelt, ist es möglicherweise besser, Fremdschlüssel zu verwenden und beim Löschen zu kaskadieren. Dies würde tun, was Sie möchten, und auch dazu führen, dass keine redundanten Daten gespeichert werden.

Für dieses Beispiel brauchst du allerdings nicht das erste s:

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

Es ist möglicherweise besser, die Zeilen vor dem Löschen auszuwählen, damit Sie sicher sind, dass Sie das löschen, was Sie möchten:

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

Sie können die MySQL-Löschsyntax auch hier überprüfen: http://dev.mysql.com/doc/refman/5.0/en/delete.html

11
Dan

wenn die Datenbank InnoDB ist, müssen Sie beim Löschen keine Joins ausführen. nur

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

kann verwendet werden, um alle Datensätze zu löschen, die mit Fremdschlüsseln in anderen Tabellen verknüpft sind. Dazu müssen Sie Ihre Tabellen zunächst in der Entwurfszeit verknüpfen.

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;

wenn Sie MyISAM verwenden, können Sie Datensätze löschen, die sich wie folgt verbinden

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

in der ersten Zeile habe ich die beiden temporären Tabellen zum Löschen des Datensatzes initialisiert. In der zweiten Zeile habe ich die existierende Tabelle sowohl a als auch b zugewiesen. Hier habe ich jedoch beide Tabellen mit dem Join-Schlüsselwort verknüpft und den Primär- und Fremdschlüssel abgeglichen Für beide Tabellen, die Verknüpfung herstellen, habe ich in der letzten Zeile den Datensatz nach dem zu löschenden Feld gefiltert.

6
Aylian Craspa