spawnlist
とnpc
の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");
最初の行のs
に.*
を追加します。
試してください:
DELETE s.* FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");
データベースが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
データベースが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の両方に割り当てましたが、ここでは両方のテーブルを結合キーワードでリンクし、主キーと外部キーを一致させましたリンクを作成する両方のテーブルについて、最後の行で、削除するフィールドでレコードをフィルタリングしました。