SQL İNSERT İŞLEMİ
SQL de verilerin kaydedilmesi, güncellenmesi ve gereksiz verilerin silinmesi için DML kullanılır. Aslında dml için sql’de programatik geliştirme yaparken kullandığımız t-sql dilininin bahsedilen işlemleri gerçekleştirmek için özelleştirilmiş komutları diyebiliriz. Bunlar sırasıyla
İşlemleridir.
Adından da anlaşılabilecği gibi insert yeni veri eklemek için kullanılırken update güncelleme delete ise silmek için kullanılır. Bu işlemlerle beraber select ifadesi de dml komutu olarak adlandırılır.
İnsert:
Kullanımı
INSERT INTOTABLO_ADI(KOLON1,KOLON2,KOLON3)VALUES (DEĞER1,DEĞER2,DEĞER3)
TABLO_ADI : eklem yapılacak tablo adıdır
Kolon1,2,3 tabloda veri eklenecek kolonların adı
Değer1,2,3 ise eklenecek verilerdir.
use AdventureWorks2014
goINSERT Production.Location(Name,CostRate,Availability)VALUES(‘DEPOLAMA’,11.00,80.00)
Örnekte görüldüğü gibi Production.Locationtablosunda Name,CostRate,Availability alanlarına ‘DEPOLAMA’,11.00,80.00verileri eklenmiştir.
İnsert işlemlerinde default değer kullanımı
İnsert işleminde bazı alanlara her seferinde değer girmek yerine o alan için önceden belirlenmiş varsayılan değerin otomatik olarak girilmesini isteyebiliriz.
Production.Location tablosunun özelliklerine baktığımızda ModifiedDate alanının varsayılan değeri getdate() olarak belirtilmiş. Bu demektir ki ModifiedDate alanına herhangi bir değer girişi yapılmıyorsa. Sistem otomatik olarak getdate() fonksiyonunu çalıştırıp aldığı değeri alana girecektir.
Select ile kayda baktığımızda ModifiedDate alanında gördüğüm değer 2018-03-14 23:57:45.410’dir.
IDentıty değerlerin insert edilmesi
Tabloya veri eklenmesi ile ilgili bir diğer ise identity alanlara veri eklemesidir. Production.Location tablomuzda tablo yapısına baktığımızda LocationID alanı identity bir alandır.
İdentity alanlar, tabloya bir kayıt eklendiğinde otomatik artan bir rakam alarak ilgili alana eklenir. Bu işlem sql server tarafından yönetildiğinden bizim herhangi bir bilgi girmemiz gerekmez.
INSERT Production.Location( LocationID,Name,CostRate,Availability)VALUES(1,‘DEPOLAMA’,11.00,80.00)
İle tabloya bir kayıt eklemek istersek;
Msg 544, Level 16, State 1, Line 3Cannot insert explicit value for identity column in table ‘Location’ when IDENTITY_INSERT is set to OFF.
Şekilnde bir hata alacağız. Hatadan da anlaşıldığı gibi,sql identity alanlara veri girmemize izin vermiyor. Bu alanı kendisi yönetiyor.
Bazı durumlarda buna mecbur olabiliriz. Bu zamanlarda ise
set identity_insert Production.Location onINSERT Production.Location( LocationID,Name,CostRate,Availability)VALUES(8,‘DEPO’,11.00,80.00)set identity_insert Production.Location off
şeklinde veri girişi yapabiliriz.
set identity_insert Production.Location on ile identity insert’i açtık
set identity_insert Production.Location on ile identity insert’i kapattık
identity insert’i açtığınız zaman geri kapatmayı unutmayınız.
Uniqueidentifier
İdentity değerler tek tablo için sorunsuz olabilir. Peki ya aynı tablo yapısı yüzlerce farklı lokasyonda doluyor, ardından birleştiriliyorsa veya farklı rmdbs lerden bilgi geliyorsa tekiliği sağlayamayabiliriz.
Bu durumlarda Uniqueidentifier alanlar yardımımıza koşuyor. Uniqueidentifier
Veri tipi 16 byte uzunluğunda dünya çapında Uniqueidentifier
(GUID) ile temsil edilir. Bunun sebebi ise numerk ve alfanumerik değerlerin bir arada kullanılması ile elde edilir. Sql’de NNEWID() sistem fonksiyonu ile kullanılır.
INSERTPurchasing.ShipMethod
(Name,ShipBase,ShipRate,rowguid)VALUES(‘GUID’,8.99,1.15,NEWID())
Örnek olarak verilebilir.
Insert ve selectin beraber kullanımı
Su ana kadar insert işlemlerinde hep elle kayıt girdik peki bir tablodan gelen verileri insert etmek istersek ne yapmalıyız.
INSERT İNTO
TABLO(TABLO ALANLARI)
SELECT (SEÇİLEN ALANLAR)FROM TABLO
ÖRNEK olarak
USE AdventureWorks2014
GOINSERT INTO Production.Location(Name,CostRate,Availability)SELECT TOP 10 NAME,StandardCost, 0 AS Availability FROM Production.Product
Production.Location tablosuna Production.Product tablosundan gelen ilk 10 değeri yazdık
Dikkat edilmesi gereken nokta ise insert işlemi için verilen tablo alanları ile select sorgusundan gelen alan sayısı, sıraları ve veri tipleri uyumlu olmalıdır.
Stored procedure’den gelen verinin insert edilmesi
Aynı anda birden fazla kayıt ekleme işlemi için en sık kullanılan bir yöntem ise stored procedure tarafından üretilen verilerin belli bir tabloya insert edilmesidir.
SP bir veya birden fazla t-sql ifadesini toplu işlem yapabilen bir sql server nesnesidir.
Örnekle değinirsek ilk başta bir SP oluşturacağız ardından bunu bir tabloya yazacağız.
create procedureson_eklenen_prod_list_10_kayıt
asbeginselect top 10 Name,StandardCost, 0 AS AvailabilityfromProduction.Product order by ProductID descendgo
çalışıp çalışmadığını kontrol edelim
exec son_eklenen_prod_list_10_kayıt
çalıştı
şimdi de geln verileri başka bir tabloya insert edelim
INSERT INTO Production.Location(NAME,CostRate,Availability)exec son_eklenen_prod_list_10_kayıt
BİRDEN FAZLA VERİ İNSERT ETMEK
Bazı durumlarda SP oluşturmadan veya herhnagi bir kontrol ypamadan birden fazla değer girmek gerekebilir. Sql 2008 den beri aynı insert ifadesi için birden fazla values kullanmadan tek seferdekayıt eklemek mümkündür.
insert into Person.AddressType(name,rowguid,ModifiedDate)values(‘adres 1’,NEWID(),getdate()),(‘adres 2’,NEWID(),getdate()),(‘adres 3’,NEWID(),getdate())
Şeklinde veri girişi yapabiliriz.
İnsert ile output kullanımı
Sql 2008 ile beraber gelen yeniliklerden biride tabloya eklenen kayıtlara ekstra bir işleme gerek kalmadan output ile erişebilmektir.
Sql verileri tabloya yazmadan önce inserted denilen sanal bir tabloya yazar. Bizde bu tabloyu sorgulayarak yeni eklediğimiz kaydın detaylarına erişebiliriz.
insert into Person.AddressType(name,rowguid,ModifiedDate)
output inserted.Name,inserted.rowguid,inserted.ModifiedDate
values
(‘adres 1’,NEWID(),getdate()),
(‘adres 2’,NEWID(),getdate()),
(‘adres 3’,NEWID(),getdate())