SQL INSERT INTO: Tabloya Satır Ekleme Adımları
Beceri rehberi

SQL INSERT INTO: Tabloya Satır Ekleme Adımları

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

INSERT INTO, tabloya yeni satır ekleyen komuttur. Kolon listesinin neden yazılması gerektiğini, birden çok satırı tek komutta nasıl ekleyeceğinizi ve ekleme hatalarının nereden geldiğini örneklerle öğrenirsiniz.

Bir bakışta

  1. Her INSERT komutunda kolon listesini açıkça yazın. Liste yoksa değerler tablonun kolon sırasına göre eşleşir ve tablo değişince komut sessizce yanlış çalışabilir.
  2. Listede olmayan kolon varsayılan değerini ya da NULL'ı alır. Otomatik artan kimlik gibi kolonları listeye koymadan bırakmak doğru yoldur.
  3. Birden çok satır tek komutta eklenebilir. VALUES sonrasına virgülle ayrılmış satır grupları yazılır; çok büyük yüklemeler için toplu yükleme araçları daha uygundur.
  4. Komutun hatası çoğunlukla kısıtlardan gelir. Boş bırakılamayan kolon, benzersiz anahtar ve yabancı anahtar ihlali ekleme işlemini durdurur.

Tek satır ekleme: temel söz dizimi

INSERT INTO komutu birkaç parçadan oluşur: hedef tablo, değer verilecek kolonlar ve değerler. Müşteri tablosuna bir kayıt eklemek için:

INSERT INTO musteri (ad, soyad, sehir) VALUES ('Ayşe', 'Kaya', 'İzmir');

Metin değerler tek tırnak içine yazılır, sayılar tırnaksız girilir. Kolon listesindeki sıra ile VALUES içindeki sıra birebir eşleşmelidir; ad kolonuna giden değer VALUES'taki baştaki değerdir. Kolon sayısı ile değer sayısı tutmazsa sistem hata verir.

Listede yer almayan her kolon için sistem tablo tanımındaki varsayılan değeri kullanır, varsayılan yoksa NULL yazar. Bu yüzden otomatik artan kimlik (identity, auto increment) kolonlarını INSERT'e koymadan bırakırsınız; değeri veritabanı kendisi üretir. Kolon boş bırakılamıyorsa (NOT NULL) ve varsayılanı da yoksa komut hata verir. Varsayılan değeri özellikle kullanmak isterseniz değer yerine DEFAULT sözcüğünü yazabilirsiniz.

Metnin içinde tek tırnak geçiyorsa (örneğin bir soyadındaki kesme işareti) tırnağı yinelemek gerekir: 'O''Neil' biçiminde yazılan değer, veritabanına O'Neil olarak girer. Değeri bilinmeyen bir kolon için NULL sözcüğünü tırnaksız yazın; tırnak içindeki 'NULL' bir metindir ve veritabanında gerçekten NULL sözcüğü olarak saklanır. Bu hatalar, ilk bakışta sorunsuz çalışıp raporlarda sürpriz çıkaran türdendir.

Komutun çalıştığını SELECT ile doğrulayın. PostgreSQL'de RETURNING eki, eklenen satırı ya da üretilen kimliği aynı komutla geri verir. MySQL'de LAST_INSERT_ID() son otomatik üretilen değeri verir ve bu değer bağlantıya özeldir; başka bir oturumun eklemesi sonucu etkilemez. SQL Server'da aynı ihtiyaç için OUTPUT ya da SCOPE_IDENTITY kullanılır.

Kolon listesini neden yazmalısınız?

SQL, kolon listesi olmadan da INSERT'e izin verir: değerler tablodaki kolon sırasına göre eşleşir. Kısa bir deneme için çalışır ama kalıcı kodda tehlikelidir. Tabloya yeni bir kolon eklendiğinde ya da kolon sırası değiştiğinde, listesiz yazılmış komut ya hata verir ya da değerleri yanlış kolonlara yazar. Kolon listeli komut ise tablo değişse bile aynı anlamda çalışmaya devam eder, yeni kolon da varsayılan değerini alır.

Listeyi yazmanın bir faydası da okunabilirliktir. Komutu açan biri hangi değerin hangi kolona gittiğini tabloya bakmadan görür. Ayrıca otomatik üretilen kolonları dışarıda bırakmanızı kolaylaştırır; listesiz komutta bu kolon için de değer vermeniz gerekir ve genellikle sistem buna izin vermez.

Şekil 1

Kolon listesi, tablo değiştiğinde komutu ayakta tutar

Aynı ekleme iki farklı yazımla

Kolon listesiz
Kolon listeli
Değerler tablonun kolon sırasına bağlıdır
Değerler kolon adlarıyla eşleşir
Yeni kolon eklenince komut hata verebilir
Tablo değişse de komut aynı anlamda kalır
Hangi değerin nereye gittiği tabloya bakmadan anlaşılmaz
Komut kendi kendini açıklar
Kaynak: Sayfa içeriği; PostgreSQL INSERT belgesiMindset Institute

Birden çok satırı tek komutla eklemek

Aynı tabloya çok sayıda satır eklerken her biri için ayrı komut yazmak gereksizdir. VALUES sonrasına virgülle ayrılmış birden çok parantezli grup yazabilirsiniz:

INSERT INTO musteri (ad, soyad, sehir) VALUES ('Ayşe', 'Kaya', 'İzmir'), ('Mert', 'Demir', 'Ankara'), ('Selin', 'Aydın', 'Bursa');

Bu yazım SQL Server, PostgreSQL ve MySQL'de çalışır. Tek komut tek işlem olarak ele alındığından satırlardan biri bir kısıtı ihlal ederse komutun tamamı geri alınır; yarım ekleme olmaz. Bu davranış çoğu zaman istediğiniz şeydir, çünkü tutarsız yarım veri bırakmaz.

Tek komutta eklenebilecek satır sayısının sistemlere göre bir sınırı vardır ve parametre sayısı da kısıtlayıcı olabilir. Çok büyük bir verinin yüklenmesi gerekiyorsa dosyadan toplu yükleme araçları ya da uygulama tarafında parça parça gönderme tercih edilir. Burada ölçüt, işlemin tekrarlanabilir ve hata anında izlenebilir olmasıdır.

Deneme verisi hazırlarken satırların aynı kolon listesine uyduğundan emin olun. Eksik değerli bir satırı NULL ile açıkça yazmak, kolon sayısını bozmaktan iyidir.

Başka bir sorgunun sonucunu eklemek: INSERT ... SELECT

VALUES yerine bir SELECT yazarak başka bir tablodan ya da hesaplanmış sonuçtan satır ekleyebilirsiniz:

INSERT INTO musteri_arsiv (ad, soyad, sehir) SELECT ad, soyad, sehir FROM musteri WHERE sehir = 'İzmir';

SELECT'in döndürdüğü kolonlar sayı, sıra ve uyumlu veri tipi bakımından hedef kolon listesiyle eşleşmelidir. Bu kalıp arşivleme, ara tablo doldurma ve veri taşıma işlerinde kullanılır. Hedef tablonun yeni mi yoksa var olan bir tablo mu olduğu da önemlidir: tabloyu aynı anda oluşturup doldurmak ayrı bir söz dizimidir ve ayrı bir konudur.

Bu sorguyu ilk kez çalıştırırken önce SELECT kısmını tek başına çalıştırıp kaç satır döndürdüğüne bakın. Yanlış bir WHERE koşulu hedef tabloyu istemediğiniz satırlarla doldurur ve geri almak ek iş çıkarır.

Ekleme hataları ve güvenli kullanım

INSERT'in başarısız olma nedenleri çoğunlukla kısıtlardır.

  • Boş bırakılamayan kolona değer verilmemesi: hata mesajı kolonun adını söyler.
  • Benzersiz anahtar ihlali: aynı kimlik ya da e-posta yeniden eklenmeye çalışılır.
  • Yabancı anahtar ihlali: bağlı olduğu tabloda karşılığı olmayan bir değer girilir.
  • Veri tipi uyuşmazlığı: sayı kolonuna metin, çok uzun metin ya da geçersiz tarih verilir.
  • Yetki eksikliği: kullanıcının tabloda ekleme yetkisi yoktur.

Hata aldığınızda mesajın kolon ve kısıt adını okuyun; çözüm neredeyse her zaman orada yazar. Var olan kayıt varsa güncelleme yapmak istiyorsanız bu ayrı bir deyimdir (PostgreSQL'de ON CONFLICT, SQL Server ve diğerlerinde MERGE gibi). Mevcut satırları değiştirmek ve silmek ise ayrı bir risk alanıdır.

Canlı veriye eklerken alışkanlık olarak işlemi açık bir transaction içinde çalıştırıp SELECT ile sonucu kontrol edin, sonra onaylayın. Komutları dosyada saklayıp aynı komutun yinelenmemesi için benzersiz kısıt tanımlamak da koruma sağlar. Kullanıcıdan gelen değerleri komut metnine birleştirerek yazmayın; uygulama kodunda parametreli sorgu kullanın, çünkü bu hem hataları hem de güvenlik açıklarını önler.

Bu beceriyi Mindset programında nerede çalışırsınız?

Mindset'in SQL ile Programlama Eğitimi, Veri İşleme Dili modülünde ekleme, güncelleme ve silme komutlarını gerçek bir veritabanı üzerinde uygulamalı ele alır. Veri girişi yapan analistler ve uygulama geliştiriciler için asıl kazanım, hatalı eklemeyi fark edip geri alabilmektir.

Öğrenmeye başlarken bir deneme veritabanında küçük bir tablo kurup kısıtları tek tek ihlal etmeyi ve hata mesajlarını okumayı deneyin.

İlgili Mindset programı

SQL ile Programlama Eğitimi

Sık sorulanlar

Sık sorulan sorular

INSERT INTO'da kolon listesi zorunlu mu?

Söz diziminde zorunlu değildir; liste yazılmazsa değerler tablonun kolon sırasına göre eşleşir. Ancak tablo yapısı değiştiğinde bu komutlar bozulur, bu yüzden kalıcı kodda ve paylaşılan betiklerde kolon listesini her zaman yazmak iyi uygulamadır.

Otomatik artan kimlik kolonuna değer vermem gerekir mi?

Hayır, kolonu listeye koymayın; veritabanı değeri kendisi üretir. SQL Server'da kimlik kolonuna elle değer yazmak için ayrı bir ayar açılması gerekir ve bu yalnızca veri taşıma gibi özel durumlarda yapılır.

Eklediğim satırın kimliğini nasıl öğrenirim?

Sisteme göre değişir. PostgreSQL'de INSERT sonuna RETURNING eklenir. MySQL'de LAST_INSERT_ID() çağrılır ve değer yalnızca o bağlantıya aittir. SQL Server'da OUTPUT eki ya da SCOPE_IDENTITY kullanılır.

Birden çok satır eklerken biri hata verirse ne olur?

Tek INSERT komutu tek işlemdir; satırlardan biri bir kısıtı ihlal ederse komutun tamamı geri alınır ve hiçbir satır eklenmez. Ayrı ayrı komutlar yazdıysanız yalnızca hatalı olan reddedilir, öncekiler ise eklenmiş kalır.

INSERT ile UPDATE arasındaki fark nedir?

INSERT yeni satır oluşturur, UPDATE var olan satırın değerlerini değiştirir. Kayıt varsa güncelle, yoksa ekle isteniyorsa her sistemin kendi birleşik yöntemi kullanılır; bu işlem upsert olarak adlandırılır.