MySQL Hatası 1093
ile Baş Etmek - Güncelleyebileceğiniz Hedef Tabloyu Belirtin
MySQL ile çalışırken, karmaşık bir şekilde Hata 1093 ile karşılaşabilirsiniz: “FROM ifadesinde güncellemek için hedef tabloyu belirleyemezsiniz.” Bu hata, bir tabloyu güncellemeye veya silmeye çalışırken, aynı zamanda onu bir alt sorguda seçmeye çalıştığınızda genellikle ortaya çıkar. Bu blog yazısında, problemi açıklığa kavuşturacak ve sorgularınızı yeniden çalıştırabilmeniz için etkili çözümler sunacağız.
Problemi Anlamak
Sunulan senaryoda, kullanıcının story_category
adında bozuk kayıtlar içeren bir tablosu var. Bu kayıtları, DELETE
ifadesinde bir alt sorgu kullanarak silmeye çalıştılar:
DELETE FROM story_category
WHERE category_id NOT IN (
SELECT DISTINCT category.id
FROM category
INNER JOIN story_category ON category_id=category.id);
Bu sorguyu çalıştırdıklarında, şu hata mesajını aldılar:
#1093 - FROM ifadesinde güncellemek için hedef tablo 'story_category' belirleyemezsiniz
Bu hata, MySQL’in bir tabloyu (bu durumda story_category
) değiştirmeye çalışırken aynı anda ondan seçmenize izin vermemesinden kaynaklanır. Bu sınırlamanın üstesinden nasıl gelebileceğimize bakalım.
Çözüm Stratejileri
1. Kendine Bağlanma Kullanma
Bu hatanın üstesinden gelmenin etkili yollarından biri kendine bağlanmadır. Bu yöntem, sorgunuzu, hedef tablo üzerinde doğrudan bir alt sorgu kullanmaktan kaçınacak şekilde yeniden yapılandırmanıza olanak tanır. İşte nasıl çalıştığı:
DELETE a
FROM story_category AS a
INNER JOIN category AS b
ON a.category_id = b.id
WHERE b.id IS NULL;
Bu örnekte:
story_category AS a
değiştirmek (veya silmek için) istediğimiz ana tabloyu belirtir.category AS b
ile bağlandığımız tablodur.- Sadece mevcut olmayan kategori kimliklerinin eşleşmesini sağlamak,
story_category
tablosundaki bozuk kayıtları temizlememize yardımcı olur.
2. Alt Sorguyu İç İçe Geçirme
Eğer bir alt sorgu kullanmanız gerekiyorsa, alt sorguyu ana sorgunun içine daha derin bir şekilde yerleştirmeyi düşünün. Böylece, bir geçici tablo oluşturarak bu hatanın üstesinden gelebilirsiniz:
DELETE FROM story_category
WHERE category_id NOT IN (
SELECT * FROM (SELECT DISTINCT category.id
FROM category
INNER JOIN story_category ON category_id=category.id) AS temp);
Bu yaklaşım, MySQL’in içteki alt sorguyu geçici bir tablo olarak düşünmesine sebep olduğundan, hedef tablonun doğrudan değiştirilmesinden kaçınır.
3. Sorgu Optimize Edicisini Ayarlama
MySQL 5.7.6 sürümünden itibaren, hala iç içe geçen alt sorgu yaklaşımını kullanmanıza rağmen bu hatayı almanıza neden olabilecek değişiklikler yapıldı. Bu sorunu yaşıyorsanız, optimize edicin ayarlarını geçici olarak ayarlamayı düşünebilirsiniz:
SET optimizer_switch = 'derived_merge=off';
Bu komut, MySQL’e türetilmiş tabloları birleştirmemesini söyler ve sorgularınızı çalıştırmanıza yardımcı olabilir. Ancak, bunun kısa vadeli bir çözüm veya tek seferlik işlemler için olduğu göz önünde bulundurulmalı; çünkü sorgu performansı ve sonuçları üzerinde etkili olabilir.
Sonuç
Tablodaki kayıtları silmeye veya güncellemeye çalışırken MySQL Hatası 1093 ile karşılaşmak yaygın bir engel olabilir, ancak bu sorunu aşmak için etkili stratejiler vardır. İster tabloyu kendisiyle birleştirerek, ister alt sorgularınızı iç içe geçirerek, ister optimize edici ayarlarını ayarlayarak bir yöntem seçin, veritabanı performansı hedeflerinizle uyumlu bir yöntem seçmenin önemli olduğunu unutmayın.
Bu çözümleri keşfetmekten çekinmeyin ve bunları özel veritabanı yapınıza ve ihtiyaçlarınıza göre uyarlayın. Keyifli sorgulamalar!