INNER JOIN ile SQL DELETE


120

Orada 2 tablolar vardır spawnlistve npcve ben den silme verilere ihtiyaçspawnlsit . npc_templateid = n.idTemplatetabloları "bağlayan" tek şeydir. Bu betiği denedim ama çalışmıyor.

Bunu denedim:

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 başına kalıyor. Soruyu okumak ve "şuna benziyor ... hmm ... öyle!" Diye düşünmek biraz tuhaftı. :)
Corbin

1
@Corbin Ne demek istediğini tamamen anlıyorum. Yeterince ilginç, bir iş projesine bir L2 sorusu için yardım alıyorum.
Marco Aurélio Deleu

T1.id = t2.id üzerinde table1 t1 iç birleşim table2 t2'den table1'den sil; ayrıntılar youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Yanıtlar:


225

Ekle .*için silk satırında.

Deneyin:

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

İşte aldığım hata: [Err] 1064 - SQL sözdiziminizde bir hata var; db.root.spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_t 'üzerinde 1. satırda [Err] DELETE l2revo.root. spawnlist db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_templateid = n.idTemplate WHERE (n.type = "canavar"); [Mesaj] Tamamlandı - Başarısız bir şekilde -------------------------------------------- ------
JoinOG

Senin hatanda, için iki farklı sunucu adı kullanıyormuşsun gibi görünüyor spawnlist. Anlıyorum l2revo.root.spawnlistve db.root.spawnlist.
ThinkingStiff

sadece buraya yapıştırırken bir hata yapıyorum, ancak benim hatamla kullanıcı adı ve db adı aynı.
JoinOG

ASTakma adlarınız için eklemeyi deneyin .
ThinkingStiff

4
@GauravRamanan s. * Mysql'e ne SİLECEĞİNİ söyler, KATILIM tablosundaki satırları silmek istemezsiniz
Julz

12

Veritabanı InnoDB ise, o zaman yabancı anahtarlar kullanmak ve silme sırasında basamaklandırmak daha iyi bir fikir olabilir, bu istediğinizi yapar ve ayrıca gereksiz verilerin depolanmasına neden olmaz.

Bu örnek için ilk lere ihtiyacınız olduğunu sanmıyorum:

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

Satırları silmeden önce seçmek daha iyi bir fikir olabilir, böylece istediğinizi sildiğinizden emin olabilirsiniz:

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

MySQL silme sözdizimini burada da kontrol edebilirsiniz: http://dev.mysql.com/doc/refman/5.0/en/delete.html


Aldığım hata şu: [Err] 1064 - SQL sözdiziminizde bir hata var; doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen el kitabına bakın INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monste '1. satırda [Err] SPawnlist s INNER’den SİL Npc n'YE KATILIN s.npc_templateid = n.idTemplate NEREDE n.type = "canavar"; [Mesaj] Bitti - Başarısız ------------------------ --------------------------
JoinOG

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

Hata: [Err] 1066 - Benzersiz tablo / diğer ad değil: 'npc' [Err] spawnlist'DEN SİLİN, npc INNER JOIN npc WHERE spawnlist.npc_templateid = npc.idTemplate AND npc.type = "monster"; [Mesaj] Tamamlandı - Başarısız bir şekilde -------------------------------------------- ------
JoinOG

Sadece bir kez çalıştıracaksanız, korkunç derecede verimsiz çalıştırabilirsiniz: Npc_templateid NEREDE spawnlist'DEN SİL (npc WHERE type = "monster" dan idTemplate SEÇİN);
Corbin

Bu benim son denemem, eğer bir katılımda sadece bir masadan siliyorsanız, neden işe yaramayacağını anlayamıyorum.
Dan

6

Veritabanı InnoDB ise, silme işleminde birleştirme yapmanız gerekmez. sadece

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

diğer tablolardaki yabancı anahtarlarla bağlantılı tüm kayıtları silmek için kullanılabilir, bunu yapmak için önce tablolarınızı tasarım zamanında bağlamanız gerekir.

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 kullanıyorsanız, bu şekilde katılan kayıtları silebilirsiniz.

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

ilk satırda kaydı silmek için iki geçici tabloyu başlattım, ikinci satırda mevcut tabloyu hem a hem de b'ye atadım ancak burada her iki tabloyu join anahtar kelimesi ile bağladım ve birincil ve yabancı anahtarı eşleştirdim bağlantı yapan her iki tablo için, son satırda silmek için kaydı alana göre filtreledim.


typeaslında diğer tabloda değil, spawnlisttabloda değil , bu nedenle birleştirme gerekli
vitro
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.