PostgreSQL syntax error at or near hatası, sorgunun SQL söz dizimi kurallarına uymayan bir bölüm içerdiğini gösterir. Hata mesajındaki ifade ve ^ imleci, çözümleyicinin sorguyu okurken takıldığı noktayı bulmana yardım eder; asıl hata çoğu zaman bu noktanın hemen öncesindeki virgül, parantez veya sözcüklerdedir.
Bu nedenle yalnızca tırnak içinde gösterilen kelimeyi değiştirmek yerine, ilgili satırın tamamını ve özellikle imleçten önceki kısmı incelemek gerekir.
Hata mesajındaki kelime ve imleç neyi gösterir?
Tırnak içindeki ifade, PostgreSQL çözümleyicisinin beklemediği veya o konumda anlamlandıramadığı parçayı gösterir; hatanın gerçek kaynağı bu kelimenin kendisi olmak zorunda değildir. Örneğin FROM ifadesi geçerli bir SQL anahtar sözcüğüdür, ancak kendisinden önce tamamlanmamış bir sütun listesi varsa hata bu kelimenin yanında raporlanabilir.
Hata çıktısındaki bölümleri şu şekilde okuyabilirsin:
- ERROR: Hatanın türünü ve kısa açıklamasını verir.
- syntax error at or near: Çözümleyicinin sorguyu okurken sorun yaşadığı ifadenin konumunu belirtir.
- LINE 1: Sorunlu parçanın sorgunun hangi satırında bulunduğunu gösterir. Sorgu birden fazla satıra bölündüyse satır numarası buna göre değişebilir.
- ^ imleci: PostgreSQL'in işaretlediği karakter konumunu gösterir.
Tek satır olarak gönderilen bir sorguda LINE 1 görülmesi normaldir. Sorgunun psql içinde birden fazla satırda yazılması, sorgu tamponunun kullanım biçimi ve istemci görünüm ayarları, hata metninin satır düzenini etkileyebilir. psql belgelerinde satır numarasının mevcut ifade içindeki konumu gösterdiği açıklanır.
Teşhis sırasında imlecin gösterdiği kelimeyi başlangıç noktası olarak kullan, ardından imleçten geriye doğru ilerle. Eksik virgül, fazladan virgül, kapanmamış parantez, yanlış yazılmış bir anahtar sözcük veya tamamlanmamış bir ifade daha önce bulunabilir.
Fazla virgül ve eksik parantez nasıl bulunur?

Fazla virgül veya eksik parantez ararken önce imlecin bulunduğu noktadan geriye bakmalı, ardından SELECT listesindeki ayırıcıları ve parantez çiftlerini kontrol etmelisin. PostgreSQL, bir virgülden sonra yeni bir ifade bekler; liste bittiği hâlde virgül bırakılırsa sonraki FROM veya kapanış parantezi beklenmeyen ifade olarak raporlanabilir.
Aşağıdaki sorguda soyad sütunundan sonra gereksiz bir virgül bulunuyor:
postgres=# SELECT ad, soyad, FROM ogrenciler;
ERROR: syntax error at or near "FROM"
LINE 1: SELECT ad, soyad, FROM ogrenciler;
^
Burada FROM kelimesi hatalı değildir. Sorun, PostgreSQL'in sondaki virgülden sonra bir sütun veya ifade beklemesi ve doğrudan FROM ile karşılaşmasıdır. Virgül kaldırıldığında sorgu söz dizimi bakımından şu hâle gelir:
SELECT ad, soyad
FROM ogrenciler;
Aynı inceleme yöntemini eksik virgül için de kullanabilirsin. İki sütun veya ifade arasında ayırıcı bulunmuyorsa imleç çoğu zaman ikinci sütun adını ya da onu izleyen anahtar sözcüğü gösterebilir. Parantezlerde ise her açılış parantezinin karşılık gelen bir kapanış parantezi olup olmadığını kontrol et. İç içe fonksiyonlarda ve alt sorgularda parantezleri çiftler hâlinde işaretlemek, hatanın hangi yapıda oluştuğunu daha hızlı görmeni sağlar.
Ayrılmış kelimeler sütun adı olarak nasıl kullanılır?

Ayrılmış bir kelimeyi sütun adı olarak kullanmak için adı çift tırnakla yazabilirsin. Tanımlayıcı, tablo veya sütun gibi bir nesnenin adıdır; ayrılmış kelime ise SQL söz diziminde özel bir görevi olduğu için bazı bağlamlarda serbestçe tanımlayıcı olarak kullanılamayan sözcüktür.
Örneğin aşağıdaki tabloda user sütunu çift tırnakla oluşturulur ve bir değer eklenir:
CREATE TEMP TABLE ogrenciler ("user" text);
INSERT INTO ogrenciler ("user") VALUES ('deniz');
Bu sütunu okumak isterken aşağıdaki sorguyu yazarsan söz dizimi hatası almazsın, ancak sorgu sütundaki değeri de getirmez:
SELECT user FROM ogrenciler;
PostgreSQL bu bağlamda user ifadesini mevcut veritabanı kullanıcısı olarak yorumlar. Dolayısıyla sonuç, tablodaki deniz değeri yerine sorgunun çalıştığı oturumdaki geçerli kullanıcı adını içerir. Bu, hata mesajı vermeden yanlış veriye ulaşabileceğin bir durumdur.
Sütundaki değeri almak için tanımlayıcıyı çift tırnakla yaz:
SELECT "user" FROM ogrenciler;
Bu örnekte sorgu deniz değerini döndürür. PostgreSQL anahtar kelime tablosunda user, order ve group ayrılmış kelimeler arasında yer alır. order veya group adında bir sütun oluşturman gerekiyorsa adı çift tırnakla yazabilirsin; yeni bir şema tasarlarken kullanici_adi gibi daha açıklayıcı adlar seçmek de karışıklığı azaltabilir.
Tek ve çift tırnak karıştırıldığında ne olur?
PostgreSQL'de tek tırnak metin sabitini, çift tırnak ise tablo veya sütun adı gibi bir tanımlayıcıyı belirtir. Bu nedenle metin değerini çift tırnakla yazarsan PostgreSQL onu değer olarak karşılaştırmak yerine bir sütun adı olarak çözümlemeye çalışır.
Önceki örnekte oluşturulan ogrenciler tablosunda şu sorguyu düşün:
SELECT "user" FROM ogrenciler WHERE "user" = "deniz";
Tabloda deniz adlı bir sütun bulunmadığı için bu sorgu, syntax error yerine sütunun bulunamadığını belirten bir hata üretir. Hata mesajındaki sütun adını gördüğünde, değeri yanlışlıkla çift tırnak içinde yazıp yazmadığını kontrol et.
Karşılaştırılacak metni tek tırnakla yazdığında sorgu, sütundaki değeri aradığın metinle karşılaştırır:
SELECT "user" FROM ogrenciler WHERE "user" = 'deniz';
Örnekte eklenen satır için sorgu deniz değerini döndürür. Ayrıca çift tırnaklı tanımlayıcılarda büyük ve küçük harfler korunur: "User" ile "user" farklı adlardır. Tırnaksız tanımlayıcılar ise PostgreSQL tarafından küçük harfe dönüştürülür.
MySQL söz dizimi PostgreSQL için nasıl uyarlanır?
MySQL için yazılmış bir sorguyu PostgreSQL’e uyarlarken tanımlayıcıların yazımını ve kullanılan komutların söz dizimini kontrol etmelisin. Tanımlayıcı, tablo veya sütun gibi bir veritabanı nesnesinin adıdır.
Örneğin MySQL’de tablo adını çevrelemek için kullanılabilen ters tırnaklar, aşağıdaki sorguda PostgreSQL söz dizimine uymaz:
SELECT * FROM `ogrenciler`;
Tablo küçük harflerle ogrenciler adıyla oluşturulduysa ters tırnakları kaldırarak sorguyu şöyle yazabilirsin:
SELECT * FROM ogrenciler;
Tablo mevcutsa ve erişim yetkin varsa sorgu tablodaki satırları getirir. Tanımlayıcıyı tırnak içine almak gerektiğinde PostgreSQL’de çift tırnak kullanılır; çift tırnak içindeki adın büyük ve küçük harfleri tablonun oluşturulduğu adla eşleşmelidir.
LIMIT ve OFFSET değerlerini nasıl dönüştürürsün?
MySQL’de LIMIT 5, 10 ifadesindeki ilk sayı atlanacak, ikinci sayı ise getirilecek en fazla satır sayısını belirtir. PostgreSQL’de aynı işlem LIMIT 10 OFFSET 5 şeklinde yazılır.
Örneğin tabloda her öğrenciye ait benzersiz bir id sütunu varsa sorgu şöyle olabilir:
SELECT * FROM ogrenciler
ORDER BY id
LIMIT 10 OFFSET 5;
Bu sorgu, id sırasındaki ilk 5 satırı atlayıp sonraki en fazla 10 satırı getirir. ORDER BY ile benzersiz bir sıralama belirlemek, hangi satırların seçileceğini öngörebilmeni sağlar.
Başka bir veritabanından aldığın sorguyu çalıştırmadan önce tırnakları ve kullanılan söz dizimini PostgreSQL’e göre gözden geçirmen, uyarlama sırasında hata kaynağını bulmanı kolaylaştırır.