sql insert hataları etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
sql insert hataları etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Microsoft SQL’de herhangi bir tabloya veri eklemenin bir çok yolu vardır. Bir tabloyu edit modunda açarak manuel olarak elle girerek tablo üzerinde ilgili kolonlara ekleyebiliriz mesela. Ama ben bu yazımda T-SQL yani kod ile veri ekleme nasıl yapılır buna değinmek istiyorum. Çünkü her zaman SQL Server Management Studio kullanılmaz, özellikle yazılım uygulamarımızda, WEB uygulamalarımızda oluşturduğumuz projelerde veri kaydı yapabilmek için ilgili aplikasyonu kullanırız. Yani onun üzerinde yer alan örneğin bir butona basmak sureti ile kayıt yaparız. Dolayısı ile bizim için önemli olan işin kodsal anlamında nasıl yapıldığının bilinmesi. Şimdi bu yazıma devam etmek için ben AdventureWorks2012 veri tabanı üzerinde bir tablo oluşturacağım. Bunu da kodla oluşturuyorum.
1
2
3
4
5
| CREATE TABLE MusteriDemo (MusteriID INT NOT NULL PRIMARY KEY , Ad NVARCHAR(50) NOT NULL , IkinciAd NVARCHAR(50), Soyad NVARCHAR(50) NOT NULL ); |
Bu kod ile ben MusteriDemo adında MusteriID, Ad, IkinciAd ve Soyad kolonlarına sahip bir tablo oluşturdum. Tablomda MusteriID alanı NOT NULL diyerek boş geçilemez be INT tipinde bir PRIMARY KEY yaptım. Ad, IkinciAd ve Soyad kolonları ise NVARCHAR tipinde ve 50 karakter alanına sahip kolonlar. Bunlarda da Ad ve Soyad alanı boş geçilemez dedim. Sorgumu çalıştırdığımda Command(s) completed successfully. bilgisini alırım. Böylelikle tablom oluşturulmuş olur. SQL Server Management Studi üzerinde AdventureWorks2012 veritabanı üzerinde sağ tıklayıp refresh dediğimde tables altında artık ben oluşturduğum MusteriDemo tablosunu görebilirim.
SQL için veri eklemenin en basit kod metotlarından birisi her bir sorguda tek bir satır için veri eklemektir. Örneğin kullanıcın bir WEB form ya da windows form doldurup daha sonra kaydet tuşuna basması. Bu tek bir komut ile tek satır verinin kaydıdır aslında. Burada SQL Server’a tek bir INSERT komutu yollanır. Yeni veri girebilmek için bir başka INERT komutunun yollanması gerekir. Tek satırda bilgi girmenin iki söz dizimi vardır:
INSERT INTO tabloAdı (kolon1, kolon2) SELECT değer1, değer2;
Diğeri;
INSERT INTO tabloAdı (kolon1, kolon2) VALUES (değer1, değer2);
Bu söz dizimlerinde görüleceği üzere INTO kısmını koyu yaptım. Burada değinmek istediğim bir nokta var, INTO kısmını kullanmak şart değil. Yani sadece INSERT dememiz de yeterli. Ama genelde INSERT INTO birlikte kullanılırlar. Ayrıca veri eklemek içinde genelde ikinci sırada vermiş olduğum VALUES ile değerlerin belirtilmesi daha çok tercih edilir. Tabi bunlar zorunluluk değil.
Şimdi farklı metotlarda veri gireceğim. Bazılarının ikinci adı olacak bazılarının olmayacak.
1
2
| INSERT INTO dbo.MusteriDemo (MusteriID, Ad, Soyad) VALUES (1, 'İsmail' , 'GÜRSOY' ); |
MusteriDemo tablosuna MusteriID alanına 1, Ad alanına İsmail ve Soyad alanına GÜRSOY girdim. IkinciAd kolonuma değer vermedim dolayısı ile onu kodda kullanmadım. Bu kodda INSERT INTO kullandım ve VALUES kullandım. Bir diğer yöntem:
1
2
| INSERT INTO dbo.MusteriDemo (MusteriID, Ad, IkinciAd, Soyad) SELECT 2, 'Gözde' , 'Pınar' , 'HATTAT' ; |
MusteriDemo tablosuna MusteriID alanına 2, Ad alanına Gözde, IkinciAd alanına Pınar ve Soyad alanına HATTAT girdim. Dolayısı ile bu sefer parantez içi kısımda 4 kolonun adını da belirttim. Bu kodda INSERT INTO ile birlikte SELECT kullandım. Dolayısı ile SELECT sonrası parantez yok.
1
2
| INSERT dbo.MusteriDemo (MusteriID,Ad,Soyad) SELECT 3, 'Kamil' , 'ASLAN' ; |
MusteriDemo tablosuna MusteriID alanına 3, Ad alanına Kamil ve Soyad alanına ASLAN girdim. Dolayısı ile parantez içi kısımda bu sefer IkinciAd alanımı yazmadım. Sadece INSERT ile birlikte SELECT kullandım. Dolayısı ile SELECT sonrası parantez yok ve INTO başta yer almıyor.
1
2
| INSERT dbo.MusteriDemo (MusteriID, Ad, IkinciAd, Soyad) VALUES (4, 'Remziye' , 'Didem' , 'ELBİSECİ' ); |
MusteriDemo tablosuna MusteriID alanına 4, Ad alanına Remziye, IkinciAd alanına Didem ve Soyad alanına ELBİSECİ girdim. Dolayısı ile bu sefer parantez içi kısımda 4 kolonun adını da belirttim. Bu kodda INSERT ile birlikte VALUES kullandım, dolayısı ile değerler parantez içinde ve INSERT sonrası INTO yok.
Görüleceği üzere farklı şekillerde yazabiliyoruz ama en çok kullanılanı INSERT INTO ve VALUES şeklinde olanı. Şimdi 6 satır daha veri giriyorum ve bunları ayrı ayrı açıklamıyorum. Sadece tüm kolonların dolduğu ve dolmadığı durumlara dikkat edin. Dolması gerekenlerde 4 kolonuda yazıyorum, istemediklerimde sadece 3 ü. Çünkü hepsinin ikinci adı yok, zaten tablo oluştururken de IkinciAd kolonu için NULL değer alabilir demiştik.
1
2
| INSERT INTO dbo.MusteriDemo (MusteriID, Ad, IkinciAd, Soyad) VALUES (5, 'Veli' , 'Ali' , 'ARABACI' ); |
1
2
| INSERT INTO dbo.MusteriDemo (MusteriID, Ad, Soyad) VALUES (6, 'Aslı' , 'YAŞAM' ); |
1
2
| INSERT INTO dbo.MusteriDemo (MusteriID, Ad, IkinciAd, Soyad) VALUES (7, 'Servet' , 'Muhammed' , 'KURTULUŞ' ); |
1
2
| INSERT INTO dbo.MusteriDemo (MusteriID, Ad, IkinciAd, Soyad) VALUES (8, 'Nalan' , 'Aysun' , 'KALP' ); |
1
2
| INSERT INTO dbo.MusteriDemo (MusteriID, Ad, Soyad) VALUES (9, 'Burhan' , 'SUSAM' ); |
1
2
| INSERT INTO dbo.MusteriDemo (MusteriID, Ad, Soyad) VALUES (10, 'Nesrin' , 'REKOR' ); |
Bir tane de şöyle bir örnek yapalım. INSERT INTO kullanalım 4 kolonuda tanımlayalım ama değer girmeyelim yerine NULL yazalım. O zaman şöyle yazmamız gerekir:
1
2
| INSERT INTO dbo.MusteriDemo (MusteriID, Ad, IkinciAd, Soyad) VALUES (11, 'Esra' , NULL , 'ÇEKİMSER' ); |
Görüleceği üzere 4 kolonuda verdim ancak, Esra ikinci bir ad olmadığı için NULL yazdım. Eğer NULL yazmasa idim ve 4 kolonu da tanımlamış olsa idim hata alırdım.
Birde hiç alan tanımlamadan tablomda 4 tane alanım olduğu için bu 4 alana sıra ile verileri girerekde kayıt yapabilirim. Burada kural eğer alan tanımlamaz isek mutlaka alan sayısı kadar uygun veri tiplerinde verilerin girilmesidir. Bunu INSERT INTO ve VALUES, INSERT INTO ve SELECT ile birlikte yapalım. Ayrıca sadece INSERT ve VALUES ve INSERT ve SELECT ile yapalım. Girmeyeceğim alanlara NULL yazarım, girilecek alanları belirtirim.
1
| INSERT INTO dbo.MusteriDemo VALUES (12, 'Erdinç' , NULL , 'HUKUKÇU' ); |
1
| INSERT INTO dbo.MusteriDemo VALUES (13, 'Gamze' , 'Oya' , 'REFAH' ); |
1
| INSERT INTO dbo.MusteriDemo SELECT 14, 'Orhan' , 'Kadir' , 'İNANÇ' ; |
1
| INSERT INTO dbo.MusteriDemo SELECT 15, 'Barçın' , NULL , 'DESTEKÇİ' ; |
1
| INSERT dbo.MusteriDemo VALUES (16, 'Mehmet' , NULL , 'ARAŞTIRMACI' ); |
1
| INSERT dbo.MusteriDemo VALUES (17, 'Pakize' , 'İnci' , 'TALİHLİ' ); |
1
| INSERT dbo.MusteriDemo SELECT 18, 'Ferit' , 'Rahmi' , 'ÇELİK' ; |
1
| INSERT dbo.MusteriDemo SELECT 19, 'Ayşe' , NULL , 'EREN' ; |
Şimdi hepsini listeleyelim bakalım 19 kayıt var mı?
1
| SELECT * FROM dbo.MusteriDemo; |
Şimdi doğru kodları yazdık, birde hatalı kodları nasıl yazıyoruz, bunu görelim.
1
2
| INSERT INTO dbo.MusteriDemo (MusteriID, Ad, IkinciAd, Soyad) VALUES (1, 'Sezen' , 'Seren' , 'DEMİRCİ' ); |
Dediğimde şöyle bir hata alırım.
Violation of PRIMARY KEY constraint ‘PK__MusteriD__7262447180FC1418′. Cannot insert duplicate key in object ‘dbo.MusteriDemo’. The duplicate key value is (1).
The statement has been terminated.
The statement has been terminated.
Bu şu demek. Ben MusteriID alanını Primary Key olarak tanımladım. Dolayısı ile bu alandaki bir değer aynı tablo içinde başka bir değerle asla benzer olamaz. Ben burada 1 değerini verdiğim için ve tabloda daha önceden 1 değeri ile kayıtlı başka bir kayıt bulunduğu için hata alıyorum. Ayrıca Primary Key özelliğine sahip kolonlara NULL değerde verilemez. Burada hata Primary Key kısıtlaması nedeni ile çıkıyor yani.
Bir başka sorgu :
1
2
| INSERT INTO dbo.MusteriDemo (MusteriID, IkinciAd, Soyad) VALUES (20, 'Berru' , 'DAVOS' ); |
Aldığım hata :
Cannot insert the value NULL into column ‘Ad’, table ‘AdventureWorks2012.dbo.MusteriDemo'; column does not allow nulls. INSERT fails.
The statement has been terminated.
The statement has been terminated.
Burada bu hatayı almamın sebebi şu. Ben tablomu oluştururken Ad kolonu için NOT NULL dedim, yani NULL olarak, boş olarak geçilemez. Oysaki sorgumda ben alanlar içinde Ad kolonunu belirtmiyorum. Dolayısı ile hata kaçınılmaz. Aynı durum Soyad kolonu içinde geçerli, eğer Soyad kolonuda tanımlanmamış olsa ya da Ad tanımlanmış ama Soyad tanımlanmamış olsa idi aynı hatayı alırdım.
Bir diğer sorgu
1
| INSERT INTO dbo.MusteriDemo VALUES (20, 'Yılmaz' , 'ARABACI' ); |
Bur sorgum sonucu aldığım hata : Column name or number of supplied values does not match table definition.
Ben tablomu tanımlarken 4 tane alan verdim. Sorgumda hangi alanlara kayıt yapılacağını belirtmemişim. Ve sadece 3 tane veri kaydetmeye çalışıyorum. SQL burada hangisini nereye kaydedecek bilemez. Dolayısı ile tanımlama eksikliği mevcut. Eğer 4 tanesini verse idim, uygun sırada verdiğim takdirde o zaman kayıt yapardı. Keza yukarıda böyle bi örnek yaptım.
Bir diğer sorgu :
1
2
| INSERT INTO dbo.MusteriDemo (MusteriID, Ad, Soyad) VALUES (20, 'Halime' , NULL , 'TEPE' ); |
Aldığım hata : There are fewer columns in the INSERT statement than values specified in the VALUES clause. The number of values in the VALUES clause must match the number of columns specified in the INSERT statement.
Ben INSERT alanında burada 3 kolon adı veriyorum ancak VALUES kısmında 4 veri alanım var. Bu da hataya sebebiyet verir. Yani INSERT alanında belirttiğim alan sayısından fazla veri sayı olması da bir hatadır.
1
2
| INSERT INTO dbo.MusteriDemo (MusteriID, Ad, Soyad) VALUES ( 'A' , 'Kadriye' , 'ÇEVRE' ); |
Aldığım hata : Conversion failed when converting the varchar value ‘A’ to data type int.
Ben tablomu oluştururken MusteriID alanı için INT yani integer tipinde veri alabilir dedim. Oysa burada yolladığım değer A değeri. SQL bunu int değere çevirmeye çalışıyor ancak başarılı olamıyor, dolayısı ile hata alıyorum.
Görüleceği üzere tablolara tek satır üzerinden veri aktarmak oldukça basit ancak dikkat edilmesi gereken noktalar var. Bu yazıda nasıl veri kaydedileceğini ve olası sıkça karşılaşılabilecek hatarlı elimden geldiğince aktarmaya çalıştım. Tabi hatalar asla bu kadar sınırlı değil ama hepsini yansıtabilmek mümkün değil.
Sorgularımızı yazarken dikkatli olmalıyız.
SQL Kayıt Ekleme(İnsert İnto)
Kaydol:
Kayıtlar
(
Atom
)