web-dev-qa-db-ja.com

内部結合を使用したSQL DELETE

spawnlistnpcの2つのテーブルがあり、spawnlsitからデータを削除する必要があります。 npc_templateid = n.idTemplateだけがテーブルを「接続」します。このスクリプトを試しましたが、機能しません。

私はこれを試しました:

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

最初の行のs.*を追加します。

試してください:

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

データベースがInnoDBの場合、外部キーを使用して削除時にカスケードすることをお勧めします。これにより、必要な処理が行われ、冗長データが保存されなくなります。

ただし、この例では、最初のsは必要ないと思います。

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

削除する前に行を選択することをお勧めします。そうすることで、削除したいことが確実になります。

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

ここでMySQLの削除構文を確認することもできます。 http://dev.mysql.com/doc/refman/5.0/en/delete.html

10
Dan

データベースがInnoDBの場合、削除で結合する必要はありません。のみ

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

他のテーブルの外部キーにリンクしたすべてのレコードを削除するために使用できます。これを行うには、設計時にテーブルを最初にリンクする必要があります。

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;

myISAMを使用している場合は、このように参加しているレコードを削除できます

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

最初の行ではレコードを削除するために2つの一時テーブルを初期化し、2行目では存在テーブルをaとbの両方に割り当てましたが、ここでは両方のテーブルを結合キーワードでリンクし、主キーと外部キーを一致させましたリンクを作成する両方のテーブルについて、最後の行で、削除するフィールドでレコードをフィルタリングしました。

6
Aylian Craspa