MySQL Hata Kodu 1055 Nasıl Onarılır

Yayınlanan: 2024-03-28

MySQL Hata Kodu 1055, GROUP BY cümleciklerinin nasıl yorumlandığını ve yürütüldüğünü etkileyen SQL modunun "ONLY_FULL_GROUP_BY" etkinleştirilmesiyle ilgilidir. Gelin bu hatayı birlikte çözelim, varyasyonlarını, altta yatan nedenlerini ve en önemlisi nasıl düzeltileceğini inceleyelim.

Hatayı anlamak

MySQL Hata Kodu 1055, SELECT ifadesini ve GROUP BY yan tümcesini içeren belirli koşullar altında tetiklenir. Bu gereksinim, verileri bir arada gruplayan sorgulardan belirsiz sonuçların önlenmesini amaçlamaktadır.

Pratik anlamda, verileri bir sorguda gruplandırdığınızda MySQL'in, GROUP BY cümleciğinde yer almayan sütunlar için aynı gruba giren birden fazla satırın nasıl işleneceğini bilmesi gerekir. `ONLY_FULL_GROUP_BY` modu, MySQL'in bu kuralları uygulayarak herhangi bir gruplandırılmış sorgunun açık ve net olmasını sağlama yöntemidir.

Dolayısıyla, Hata 1055 ile karşılaştığınızda, MySQL esasen açıklama istiyor: "Seçtiğiniz sütunlar için, ya onları tam olarak nasıl gruplandıracağımı söyleyin (bunları GROUP BY cümleciğine dahil ederek) ya da verileri nasıl toplayacağımı söyleyin." (COUNT(), SUM() vb. işlevleri kullanarak).”

ONLY_FULL_GROUP_BY rolünü anlama

Bu mod, özellikle karmaşık veritabanı ortamlarında veri alma işlemlerinin doğruluğunu ve güvenilirliğini sağlamada kritik bir rol oynar.

'ONLY_FULL_GROUP_BY' etkinleştirildiğinde MySQL açık bir kural uygular: GROUP BY cümleciği içeren bir sorgunun SELECT listesinde bir sütun görünürse, bu sütun aşağıdaki ölçütlerden birini karşılamalıdır:

Toplama işlevi olun : Sütun, COUNT(), SUM(), MAX() vb. gibi bir toplama işlevi içinde kullanılır. Bu işlevler, birlikte gruplandırılmış birden fazla satırdaki verileri özetleyerek grup başına tek bir sonuç üretir.

İşlevsel olarak GROUP BY sütunlarına bağımlı olun : Sütun, işlevsel olarak GROUP BY yan tümcesinde listelenen sütunlara bağımlıdır.İşlevsel bağımlılık, bir sütunun (işlevsel olarak bağımlı sütun) değerinin diğer sütun veya sütunlar (GROUP BY cümlesindeki sütunlar) tarafından benzersiz bir şekilde belirlendiği anlamına gelir. Daha basit bir ifadeyle, GROUP BY sütununun/sütunlarının belirli herhangi bir değeri/değerleri için, işlevsel olarak bağımlı sütunun tam olarak bir olası değeri vardır.

Hatanın varyasyonları

Bu hatanın kendini gösterebileceği bazı yollar şunlardır:

  • MySQL Hata Kodu 1055: SELECT listesinin 1 numaralı ifadesi GROUP BY yan tümcesinde yer almıyor ve işlevsel olarak GROUP BY yan tümcesindeki sütunlara bağımlı olmayan, toplanmamış 'database.table.column' sütununu içeriyor; bu sql_mode=only_full_group_by ile uyumlu değil
  • Hata 1055: ONLY_FULL_GROUP_BY: GROUP BY yan tümcesinde bir şey yok
  • SQL Hatası (1055): SELECT listesinin ifadesi GROUP BY yan tümcesinde değil
  • SQLSTATE[42000]: Sözdizimi hatası veya erişim ihlali: 1055

Bu hatanın oluşma nedenleri

MySQL Hata Kodu 1055, öncelikle GROUP BY yan tümcesini kullanan sorgular için daha katı kurallar gerektiren SQL modunun "ONLY_FULL_GROUP_BY" etkinleştirilmesi nedeniyle oluşur. İşte temel nedenler:

SQL modu `ONLY_FULL_GROUP_BY` etkin : Bu mod, toplanmadıkları sürece tüm SELECT listesi ifadelerinin GROUP BY yan tümcesinde görünmesini gerektirir.Belirsiz sorgu sonuçlarını önlemek için tasarlanmıştır.

SELECT listesindeki toplanmamış sütunlar : SELECT listeniz toplama işlevlerine sarılmamış sütunlar içeriyorsa (SUM, AVG, MIN, MAX, COUNT gibi) ve bu sütunlar GROUP BY yan tümcesinin parçası değilse, MySQL bunu aşağıdaki hata olarak işaretler: "SADECE_FULL_GROUP_BY".

İşlevsel bağımlılık : MySQL, SELECT listesindeki toplanmayan sütunların işlevsel olarak GROUP BY yan tümcesine bağımlı olmasını bekler.İşlevsel bağımlılık, bir sütunun başka bir sütunu benzersiz bir şekilde belirlemesi anlamına gelir. Bu ilişki karşılanmazsa MySQL Hata 1055'i verir.

MySQL Hata Kodu 1055'i Düzeltme

Artık 1055 hata kodunun ne anlama geldiğine ve hataya neyin sebep olduğuna baktığımıza göre, bu hatayı düzeltmenin birkaç yoluna göz atalım.

Sorguyu analiz edin

MySQL Hata Kodu 1055'i çözmenin ilk adımı, bu hatayı tetikleyen sorgunun analiz edilmesini içerir. Bu inceleme, SELECT yan tümcesinde listelenen, ne GROUP BY yan tümcesinin kapsamına giren ne de birleştirilmiş sütunların yerini belirlemeyi amaçlamaktadır. Bu tutarsızlık sorunun özüdür; çünkü MySQL, ONLY_FULL_GROUP_BY SQL modu altında, net sonuçları garanti etmek için SELECT listesinde başvurulan herhangi bir sütunun (bir toplama işlevi değil) GROUP BY yan tümcesinde bildirilmesi gerektiğini zorunlu kılar.

Sorgunuzu ayarlayın

Bu hatayı düzeltmek için sorguda ayarlamalar yapılması gerekir. Değişiklikler ONLY_FULL_GROUP_BY şartlarına uyum sağlamaya odaklanıyor. Uyumluluğu sağlamak için aşağıda iki temel strateji verilmiştir:

Birleştirilmemiş tüm sütunları GROUP BY'ye dahil et

Kapsamlı ekleme : En basit yöntem, SELECT listesinde görünen ve bir toplama işlevinin parçası olmayan (COUNT, AVG, SUM vb. gibi) her sütunun GROUP BY yan tümcesine dahil edilmesini sağlamaktır.Bu yaklaşım, GROUP BY işlemlerine yönelik SQL standardına uygundur ve sonuç kümesindeki her satırın, GROUP BY yan tümcesinde belirtilen sütunlar tarafından benzersiz şekilde tanımlanmasını garanti eder.

Örnek

'Tarih', 'bölge' ve 'tutar' sütunlarına sahip 'satış' adında bir veritabanı tablonuz olduğunu hayal edin. Bölge başına toplam satış tutarını bulmak istiyorsunuz ancak ilk sorgunuz Hata 1055'i tetikliyor.

İlk Sorgu (Hata 1055'e Neden Oluyor)

 Tarih, bölge, TOPLAM(tutar) SEÇİN

satışlardan

GRUP BÖLGEYE GÖRE;

Bu sorgu bir hataya neden olur çünkü 'tarih' GROUP BY yan tümcesinde yer almamaktadır ve bir toplama işlevi içinde kullanılmamaktadır.

Değiştirilen sorgu (Hata 1055'in Çözümü)

 Tarih, bölge, TOPLAM(tutar) SEÇİN

satışlardan

GRUPLANDIRMA tarihine, bölgeye göre;

GROUP BY yan tümcesine hem "tarih" hem de "bölge" eklendiğinde sorgu "ONLY_FULL_GROUP_BY" SQL moduyla uyumlu olur ve böylece hata çözülür.

Gruplandırılmamış sütunlar için toplama işlevlerini kullanın

Stratejik toplama : GROUP BY cümleciğine toplanmamış tüm sütunların dahil edilmesinin pratik olmadığı veya sorgunun amacından saptığı senaryolarda, gruplanmamış sütunlarda toplama işlevlerinin kullanılması etkili bir alternatiftir.Bu yöntem, ONLY_FULL_GROUP_BY kısıtlamalarını aşarak benzersiz olmayan verileri anlamlı toplu sonuçlar halinde birleştirir.

Örnek

Aynı "satış" tablosunu kullanalım. Bölgeyi ve en son satış tarihini seçmek, ancak yalnızca "bölgeye" göre gruplandırmak istediğinizi varsayalım. 'Tarih' sütununa bir toplama işlevi uygulamak, bunu GROUP BY yan tümcesine dahil etmeden başarabilir.

İlk sorgu (Hata 1055'e neden oluyor)

 Bölgeyi, tarihi SEÇİN

satışlardan

GRUP BÖLGEYE GÖRE;

Bu sorgu başarısız olacak çünkü 'tarih' ne bir toplama işlevinde ne de GROUP BY yan tümcesinde yer alıyor.

Değiştirilen sorgu (Hata 1055'in Çözümü)

 Bölge SEÇİN, MAX(tarih) AS last_sale_date

satışlardan

GRUP BÖLGEYE GÖRE;

Bu değiştirilmiş sorguda, "MAX()" işlevi "tarih" sütununu toplamak için kullanılır, böylece her bölge için en son satış tarihi seçilir. Bu, GROUP BY yan tümcesindeki tek sütunun "bölge" olması ve bir toplama işlevi içinde "tarih"in kullanılması nedeniyle "ONLY_FULL_GROUP_BY" gereksinimlerine uygun olarak hatayı çözer.

'ONLY_FULL_GROUP_BY' SQL modunu devre dışı bırak

MySQL'de "ONLY_FULL_GROUP_BY" modunun devre dışı bırakılması, sorgu mantığının GROUP BY cümleciğine uygun şekilde eklenemeyen veya toplanamayan sütunların dahil edilmesini gerektirdiği durumlarda son çare olarak düşünülebilir.

Bu modun devre dışı bırakılması MySQL Hata Kodu 1055 gibi acil sorunları çözebilir, ancak deterministik olmayan sorgu sonuçları oluşturma riskini de beraberinde getirir. Bu determinizmsizlik, sorguların farklı koşullar altında farklı sonuçlar döndürmesine yol açarak potansiyel olarak veri tutarsızlıklarına ve üretim ortamlarında hata ayıklamanın zor olduğu sorunlara yol açabilir.

'ONLY_FULL_GROUP_BY' nasıl devre dışı bırakılır

Geçerli veritabanı oturumu için `ONLY_FULL_GROUP_BY`yi geçici olarak devre dışı bırakmak, yani değişikliğin yalnızca bağlantı süresince süreceği anlamına gelmek için aşağıdaki SQL komutunu kullanın:

 SET sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));

Bu komut, genel SQL modu yapılandırmasını etkilemeden veya diğer veritabanı oturumlarını etkilemeden, "ONLY_FULL_GROUP_BY"yi oturumun SQL modlarından seçici olarak kaldırır.

Küresel olarak

MySQL sunucusuna yapılan tüm yeni bağlantıları etkileyen daha kalıcı bir çözüm için genel SQL modu ayarını şu şekilde değiştirebilirsiniz:

 SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Bu komutun çalıştırılması, "ONLY_FULL_GROUP_BY"yi kaldırarak sunucu genelindeki SQL modu ayarını değiştirir, böylece değişiklik yürütme sonrasında tüm yeni bağlantılara uygulanır. Bunun mevcut bağlantıları etkilemediğini ve değişikliklerin genel olarak uygulanması için sunucunun yeniden başlatılması veya yeni bağlantıların gerekli olduğunu unutmamak çok önemlidir.

MySQL sorgularını yönetmek için en iyi uygulamalar

Özellikle karmaşık gruplama ve toplama işlevlerini içeren bağlamlarda MySQL sorgularıyla uğraşırken, bir dizi en iyi uygulamayı benimsemek çok önemlidir. Bu uygulamalar yalnızca sorgularınızın verimliliğini ve doğruluğunu sağlamakla kalmaz, aynı zamanda verilerinizin bütünlüğünü ve güvenilirliğini korumanıza da yardımcı olur, özellikle de "ONLY_FULL_GROUP_BY" SQL modu gibi kısıtlamalar arasında gezinirken.

Veri ilişkilerini anlayın : Veritabanınızdaki sütunlar arasındaki ilişkileri ve bağımlılıkları derinlemesine anlayın.Verilerin birbirine nasıl bağlandığını bilmek, daha etkili sorgular oluşturmaya ve hatalardan veya beklenmedik sonuçlardan kaçınmaya yardımcı olur.

Şema aşinalığı : Veritabanı şemasına düzenli olarak alışın.Bu aşinalık, hangi sütunların gruplandırılacağını ve hangilerinin toplu işlevlerde etkili bir şekilde kullanılabileceğini tanımaya yardımcı olur.

Stratejik uygulama : Belirli analitik hedeflere ulaşmak için toplu işlevleri ("SUM()", "AVG()", "COUNT()" vb. gibi) dikkatli bir şekilde uygulayın.Bu işlevler verileri özetlemek ve analiz etmek için güçlü araçlardır ancak uygunsuz kullanıldıklarında yanıltıcı sonuçlara yol açabilirler.

Aşırı toplamadan kaçının : Büyük veri kümelerinde toplama işlevlerini uygun gruplandırma olmadan aşırı kullanma konusunda dikkatli olun; çünkü bu, performans sorunlarına neden olabilir ve verilerden toplamaya çalıştığınız öngörüleri potansiyel olarak gizleyebilir.

Beklenen sonuçları sağlayın : Sorgularınızda "ONLY_FULL_GROUP_BY" seçeneğini devre dışı bırakmak veya sorgularınızın yapısını değiştirmek gibi ayarlamalar yaptıktan sonra, bu değişiklikleri kapsamlı bir şekilde test etmek zorunludur.Bu test, sorguların beklenen sonuçları döndürmesini ve veri bütünlüğünün korunmasını sağlar.

Performans değerlendirmesi : Test yapmak yalnızca doğrulukla ilgili değildir;aynı zamanda performansla da ilgilidir. Özellikle büyük veri kümeleri veya karmaşık toplamalarla çalışırken sorgularınızın veritabanı performansı üzerindeki etkisini değerlendirin.

Düşünceleri kapatmak

Sorguları "ONLY_FULL_GROUP_BY" ile uyumlu olacak şekilde uyarlamaya veya son çare olarak bu modu devre dışı bırakmaya odaklanarak MySQL Hata Kodu 1055'i nasıl düzelteceğimizi ele aldık. Sorunları önlemek ve güvenilir veritabanı işlemleri sağlamak için SQL standartlarını anlamanın ve bu standartlar dahilinde çalışmanın önemini vurgulayarak veri bütünlüğünü ve sorgu doğruluğunu sağlamaya yönelik en iyi uygulamaları vurguladık.

AI ile WordPress web sitesi oluşturma işleminizi hızlandırın

10Web AI Web Sitesi Oluşturucu ile iş ihtiyaçlarınıza göre uyarlanmış özel bir WordPress web sitesini 10 kat daha hızlı oluşturun.

Web Sitenizi Oluşturun
Kredi kartına gerek yok