2011-12-22 31 views
90

spawnlsit'dan 2 tablo, spawnlist ve npc vardır ve verileri silmem gerekir. Tabloları "bağlayan" tek şey npc_templateid = n.idTemplate. Bu betiği denedim ama işe yaramıyor. Veritabanı InnoDB iseINNER JOIN ile SQL DELETE

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

Daha çok şaşırdı çünkü tipik olarak L2 topluluğu kendi kendine kalıyor. Soruyu okumak ve "öyle görünüyor ki ... hmm ... bu!" :) – Corbin

+1

@Corbin Ne demek istediğini görüyorum. İlginç bir şekilde, bir iş projesine L2 sorusunda yardım alıyorum. –

cevap

156

ilk yılında s için .* ekle hat.

Dene: veritabanı InnoDB ise

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

i got hatadır: [Err] 1064 - Eğer SQL sözdizimi bir hata var; 'spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n yakınında' s.npc_t 'satırında kullanmak için doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuzu gözden geçirin [Err] DELETE l2revo .root.spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n AÇIK s.npc_templateid = n.idTemplate NEREDE (n.type = "canavar"); [Msg] Bitti - Başarısız ------------------------------------------ -------- – JoinOG

+0

Hatanızda 'spawnlist' için iki farklı sunucu adı kullanıyorsunuz gibi görünüyor. Ben l2revo.root.spawnlist ve 'db.root.spawnlist' görüyorum. – ThinkingStiff

+0

Sadece burada bir hata yaptıktan hata yapıyorum, ancak kullanıcı adı ve db adı benim hatamda aynı. – JoinOG

9

, o zaman, bu ne istediğini yapacağını silme yabancı tuşları ve kaskad kullanmak daha iyi bir fikir olabilir ve ayrıca hiçbir gereksiz verilerle sonuçlanır:

Bunu denedim saklanmak Eğer istediğinizle senin silme eminiz için silmeden önce satırları seçmek için daha iyi bir fikir olabilir

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

: Bu örnek için

ancak ilk s gerek yok

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

Ayrıca MySQL burada sözdizimi silmek kontrol edebilirsiniz: http://dev.mysql.com/doc/refman/5.0/en/delete.html

+0

Aldığım hata: [Err] 1064 - SQL sözdiziminizde bir hata var; Kullanmak için doğru sözdizimine karşılık gelen MySQL sunucu sürümünüze karşılık gelen kılavuzu kontrol edin ' INNER JOIN npc n AÇIK s.npc_templateid = n.idTemplate WHERE n.type = "monste" satır 1'de [Err] DELETE FROM spawnlist s İÇ NPC artır n AÇIK s.npc_templateid = n.idTemplate WHERE n.type = "canavar"; [iletisi] sırada - Başarısız oldu ----------------- --------------------------------- – JoinOG

+0

Değişti, şimdi daha başarılı olabilir mi? – Dan

+0

Hata: [Err] 1066 - benzersiz değil tablo/takma: 'NPC' [Err], spawnlist GELEN spawnlist SİL NPC İÇ NPC JOIN NEREDE spawnlist.npc_templateid = npc.idTemplate VE npc.type = "canavar" ; [Msg] Bitti - Başarısız ------------------------------------------ Eğer sadece bir kez çalıştırmak için gidiyoruz -------- – JoinOG

4

eğer yapmanız gerek yok silinmesine katılır. Sadece

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

ilk tasarım zamanlı olarak tablolar bağlantılı zorunda bunu yapmak için, diğer tablolardaki yabancı anahtarlarla bağlantılı tüm kayıtları silmek için kullanılabilir.

Eğer kayıtlar i varlığı tablosunu atamış DELET için iki geçici masalar ikinci satırında rekoru, başlatıldı ilk satırında bu

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

gibi katılmadan silebilirsiniz MyISAM kullanıyorsa hem a ve b için ama burada her iki tablo ile birleştirme anahtar kelime, ile bağladım ve ben bağlantı yapmak için her iki tablo için birincil ve yabancı anahtar ile eşleşti, son satırında ben silme için alana göre süzüldü.