MySQL ERROR 1046 (3D000): No database selected hatasını gidermek için işlem yapacağın veritabanını USE veritabani_adi; komutuyla seçebilirsin. Alternatif olarak sorgunda tablonun adını veritabanı adıyla birlikte belirtebilirsin. Veritabanının mevcut olduğundan ve hesabının ilgili işlem için gerekli yetkilere sahip olduğundan da emin olmalısın.
ERROR 1046 hatası neden oluşur?

Bu hata, MySQL bir işlem için kullanılacak varsayılan veritabanını bulamadığında ortaya çıkar. MySQL hata kodunu 1046, SQLSTATE değerini 3D000 ve mesajını No database selected olarak bildirir.
MySQL sunucusunda birden fazla veritabanı bulunabilir ve her veritabanı kendi tablolarını içerebilir. Örneğin okul veritabanında ogrenciler adlı bir tablo tutulabilir.
Oturum, sunucuya bağlantın süresince komutlarını yürüttüğün çalışma bağlamıdır. Etkin veritabanı ise veritabanı adı ayrıca belirtilmeyen nesneler için o oturumda kullanılan varsayılan veritabanıdır.
Sunucuya bağlandığında etkin bir veritabanı seçili olmayabilir. Böyle bir oturumda tabloyu yalnızca ogrenciler adıyla oluşturmaya veya sorgulamaya çalışırsan MySQL hangi veritabanını kullanacağını belirleyemediği için bu hatayı verebilir.
USE komutuyla veritabanı nasıl seçilir?
USE okul; komutu, erişim yetkin varsa okul veritabanını bulunduğun oturum için etkin hâle getirir. Ardından veritabanı adını tekrar yazmadan o veritabanındaki tablolarla çalışabilirsin.
Aşağıdaki örnekte veritabanı ve tablo oluşturma yetkisine sahip bir hesap kullanılır. Önce örnek veritabanını oluştur; okul zaten varsa bu adımı atlayabilirsin.
CREATE DATABASE okul;
Bir veritabanını oluşturmak onu otomatik olarak etkinleştirmez. Hata senaryosunu görmek için etkin veritabanı seçilmemiş bir oturumda aşağıdaki komutu çalıştır.
CREATE TABLE ogrenciler (
id INT PRIMARY KEY,
ad VARCHAR(100)
);
Bu koşulda beklenen hata şöyledir:
ERROR 1046 (3D000): No database selected
Şimdi erişebildiğin veritabanlarını listele:
SHOW DATABASES;
Çıktıda okul adını görmelisin. Listenin geri kalanı sunucudaki veritabanlarına ve hesabının yetkilerine göre değişebilir.
Ardından veritabanını seç ve seçimi kontrol et:
USE okul;
SELECT DATABASE();
USE başarılı olduğunda Database changed mesajı görülür. SELECT DATABASE() sorgusunun sonucu ise okul olur; etkin veritabanı seçili değilse sonuç NULL döner.
Son olarak tablo oluşturma komutunu tekrar çalıştır:
CREATE TABLE ogrenciler (
id INT PRIMARY KEY,
ad VARCHAR(100)
);
Hesabının gerekli yetkileri varsa ve ogrenciler tablosu daha önce oluşturulmamışsa komut başarılı olur. Tablo artık etkin veritabanı olan okul içinde bulunur.
Tablonun tam adıyla sorgu nasıl çalıştırılır?

Etkin bir veritabanı seçmeden de tabloyu veritabanı.tablo biçiminde yazarak sorgulayabilirsin. Önceki bölümde oluşturulan tablo için örnek sorgu şöyledir:
SELECT * FROM okul.ogrenciler;
Buradaki okul.ogrenciler ifadesi, MySQL’e ogrenciler tablosunun okul veritabanında bulunduğunu açıkça belirtir. Tablo oluşturulurken içine herhangi bir kayıt eklenmediyse sorgu başarıyla çalışır, ancak sonuç kümesi boş olur. İstemci bu durumu boş sonuç kümesi olarak gösterir.
Bu kullanımda USE komutu çalıştırılmaz. Çünkü sorgunun içinde veritabanı adı zaten verilmiştir. USE okul; komutu ise oturumun etkin veritabanını değiştirir ve bundan sonra veritabanı adı yazılmadan kullanılan tablo adlarının hangi veritabanında aranacağını belirler. Nitelendirilmiş tablo adlarıyla ilgili ayrıntıları MySQL Identifier Qualifiers belgelerinde inceleyebilirsin.
Veritabanı adını yanlış yazarsan ya da hesabın bu veritabanına erişemiyorsa sorgu boş sonuç döndürmek yerine başka bir hata verebilir. Bu durumda yalnızca sorgunun son satırına bakmak yerine dönen hata kodunu ve iletiyi birlikte kontrol et. Veritabanının gerçekten mevcut olup olmadığını ve hesabın gerekli erişime sahip olup olmadığını da ayrıca doğrula.
Bağlantıda ve SQL dosyasında veritabanı nasıl belirtilir?
Veritabanını MySQL bağlantısı kurulurken seçmek için veritabanı adını komutun sonuna ekleyebilirsin:
mysql -u kullanici -p okul
Bu komutta -u kullanıcı adını, -p ise parola istemini belirtir. Komutu çalıştırdıktan sonra parola istemi açılır ve parolayı orada girersin. Parolayı komutun içine açık biçimde yazmak, komut geçmişinde veya ekran kayıtlarında görünmesine yol açabileceği için tercih edilmez. Bağlantı sırasında veritabanı adı verilmesi, oturumun başlangıçta okul veritabanını kullanmasını sağlar.
Bir SQL dosyasını doğrudan belirli bir veritabanına bağlanarak çalıştırmak için komut şu şekilde yazılabilir:
mysql -u kullanici -p okul < dosya.sql
Buradaki < işareti, dosyanın içeriğini MySQL istemcisinin standart girdisi olarak çalıştırır. Alternatif olarak, veritabanı adını komutta belirtmeden SQL dosyasının başına şu satırı ekleyebilirsin:
USE okul;
Bu durumda dosya şöyle çalıştırılabilir:
mysql -u kullanici -p < dosya.sql
Dosyanın ilerleyen satırlarında başka bir USE komutu varsa etkin veritabanı değişir. Bu nedenle dosyada kullanılan tabloların hangi veritabanına ait olduğunu ve her işlemden önce hangi veritabanının seçili bulunduğunu kontrol etmek gerekir. Dosya çalıştırılmadan önce ilgili veritabanının mevcut olması ve bağlantı kuran hesabın gerekli yetkilere sahip bulunması da önemlidir. SQL dosyasından komut çalıştırma biçimi için MySQL istemcisinin metin dosyasından SQL çalıştırma belgelerine bakabilirsin.
ERROR 1046 hatasını çözerken temel kontrol noktası, sorgunun etkin bir veritabanına mı dayandığı yoksa tablo adının veritabanıyla birlikte mi yazıldığıdır. Bu ayrımı kontrol ettiğinde bağlantı komutundaki, SQL dosyasındaki ve sorgudaki veritabanı kullanımını daha kolay karşılaştırabilirsin.