Transact Sql(Insert-Bulk Insert-Update-Delete-Truncate-@@Identity-@@Rowncount-Checkident)
Bu yazımda insert,update ve delete komutlarının ayrıntılarını göreceğiz.
INSERT ÖZET
insert into Personeller(Adi,SoyAdi) values('ggg','aaa')
into kullanmadanda yazılabilir.
insert Personeller(Adi,SoyAdi) values('ggg','aaa')
Kolonun kabul ettiği veri tipinde ve karakter uzunluğunda kayıt yapılmalıdır.
insert Personeller(Adi,SoyAdi) values('Gençay','uzunkavakaltındayataruyuroğulları')
‘String or binary data would be truncated’ hatası alınır.Bunun anlamı veri girilen kolona veri tipinin uymadığını ya da karakter uzunluğunun uymadığını belirtir.
“Not Null” olarak ayarlı kolonlara mutlaka değer gönderilmelidir.
insert Personeller(Adi,SoyAdi,Unvan) values('Gençay',’Yıldız’,Null)
Null olabilir olarak ayarlanan kolona normal değer gönderilebileceği gibi,Null değerde gönderilebilir.
insert Personeller(Adi,SoyAdi) values('Gençay','Yıldız')
insert Personeller(Adi,SoyAdi) values('Mehmet','Çakmak')
insert Personeller(Adi,SoyAdi) values('Ali','Yıldırım')
Yukarıda gördüğünüz gibi 3 kayıt yapılmıştır.Bunu aşağıdaki gibi daha sade bir şekilde de yapabiliriz.
insert Personeller(Adi,SoyAdi) values('Gençay','Yıldız'),
('Mehmet','Çakmak'),
('Ali','Yıldırım')
Eğer bir tablonun tüm kolonlarına veri gönderilecekse () içine kolon ismi yazmak zorunda değiliz.
insert Personeller() values('kolon1 veri','kolon2 veri','kolon.. veri')
Şimdi “Northwind” veritabanımıza,içinde sadece isim ve soyisim olan iki kolonluk,”p” adında bir tablo yapalım.
insert P select Adi,SoyAdi from Personeller
Oluşturduğumuz “p” isimli tablomuza,select sorgusundan dönen bütün verileri atmış bulunuyoruz.
Ama dikkat etmemiz gereken husus var,
Select sorgusundan dönen kolon sayısı ile insert edilmek istenen tablonun kolon sayısı eşit olmalıdır.Ayriyetten bu kolonların veri tipleride eşit olmalıdır.
Yukarda manuel olarak “p” isminde bir tablo oluşturup “insert” komutuyla “select” ifadesinden dönen verileri içine insert ettik.Birde hiç tablo oluşturmadan “select” ifadesiyle otomatik tablo oluşturur ve içine insert yapılmasını sağlayabiliriz.
Bu işlem “select into” komutu ile yapılabilir.
select * into deneme from Personeller
Personeller tablosundan tüm kolonları(*) çek.Deneme isminde bir tablo oluştur ve içine insert et.Bu yöntemle oluşturulan deneme isimli tabloda primary key anahtar ve foreign key ler oluşturulmaz.
BULK INSERT (Bir text dosyasındaki verileri bir tabloya insert etmek )
Önceden hazırladığımız “deneme3” ismindeki tabloya C dizisindeki deneme.txt dosyasındaki verileri aktaralım.
Tabi öncelikle deneme3 tablosundaki kolonlar .txt dosyasındaki kolonlarla aynı sayıda olmalıdır.
.txt dosyasındaki kolonları,stunları,satırları nasıl anlıcaz diye sorarsanız eğer “TAB” ve “ENTER” ayraçlarını kullanacağız.”TAB” ile ayrılmış olanlar kolonları,”ENTER” ile ayrılmış olanlarda satırları temsil etmektedir.
bulk insert deneme3 from 'C:\deneme.txt' with ( fieldterminator = '\t', -- .txt dosyasında kolonlar “TAB” ile ayrılmış. rowterminator = '\n' -- .txt dosyasında sayırlar “ENTER” ile ayrılmış. )
UPDATE ÖZET
update Personeller set Adi='Gençay'
Dikkat! “Personeller” tablosundaki “Adi” kolonunun hepsi “Gençay” diye güncellenir.Şart yazmamız lazım.
update Personeller set Adi='Gençay' where Adi='ggg'
“Adi”,“ggg” olan verilerin “Adi” ni “Gençay” yaptık.
update Nakliyeciler set SirketAdi+='-ltd'
“Nakliyeciler” tablosundaki “SirketAdi” kolonundaki verilerin sonuna “-ltd” ekledik.
Başka bir tablo kullanarak güncelleme yapmak.
update Urunler set Urunler.UrunAdi=Kategoriler.KategoriAdi from Urunler inner join Kategoriler on Urunler.KategoriID=Kategoriler.KategoriID
“set” kodundan sonraki “Urunler.UrunAdi=Kategoriler.KategoriAdi” anlamı “Urunler” tablosundaki “UrunAdi” kolonuna , “Kategoriler” tablosundaki “KategoriAdi” kolonunundaki verileri at.Tabi bunları yapabilmek için bu iki tablo arasında bağlantı kurmamuz gerekecektir.”from” etiketini yazıp bu iki tablo üzerinden inner join yaparak bağlantı kuruyoruz.
Subquery ile güncelleme yapmak.
update Urunler set UrunAdi = (select Adi from Personeller where UnvanEki='Dr.')
Top ifadesi ile güncelleme
update top(4) Urunler set UrunAdi='X-' + UrunAdi
İlk 4 ürünümün adının başına “X-“ koy.Dikkat etmemiz gereken nokta , select yaparken “top 4” olurken,update te “top (4)” yani parantez içinde olmalıdır.
DELETE ÖZET
delete from Personeller
Dikkat! Bu şekilde “Personeller” tablosundaki veriler uçmağa varırlar.Şart yazmamız gerekiyor.
delete from Personeller where Adi='Gençay'
Adı ,Gençay olan verilerin hepsini sil.
NOT : Delete ile tablodaki tüm kayıtlar silinse bile, identity olan kolon sıfırlanmaz. identity olan kolon da sıfırlanarak tablodaki tüm kayıtlar silinmek isteniyorsa truncate kullanılmalıdır.
TRUNCATE
truncate table p
Bu işlemden sonra p tablosundaki identity olan kolon sıfırlanacaktır.
Not:Delete ile tablo temizlenirken where şartı kullanılabilir ama truncate te kullanılamaz.Bunun sebebi, veritabanımızı hazırlamışız,herşey tamam,testler bilmemneler yapılmış ve müşteriye verilmeyi bekliyor.Son kez truncate yapılarak sanki yeni tasarlanmış ve hiç ellenmemiş bir veritabanını müşteriye teslim ediyoruz.
@@IDENTITY–@@ROWCOUNT
@@identity = En son eklenen kaydın,identity olarak tanımlanmış kolonundaki veriyi getirir.
@@rowcount = Yapılan işlem sonucunda,kaç kayıtlık bir işlem yapıldığını söyler.
Şimdi @@identity ile ilgili bir örnek yapalım.
Öncelikle en son eklenen personelimin personel id sininin kaç olduğunu göstertelim.
(PersonelId kolonu identitydir.)
1.Yol >> select MAX(PersonelID) from Personeller
2.Yol >> select top 1 PersonelID from Personeller order by PersonelID desc
3.Yol >> insert Personeller(Adi,SoyAdi) values('Gençay','Yıldız')
select @@IDENTITY
Şimdide @@rowcount komutunu örneklendirelim.
Bakalım delete işlemi sonucunda kaç kayıt silinmiş.
delete from Personeller where Adi='Gençay' select @@ROWCOUNT
İSTEDİĞİMİZ TABLONUN IDENTITY ÖZELLİKLİ KOLONUNU İSTEDİĞİMİZ DEĞERDE BAŞLATMA
dbcc checkident(Personeller,reseed,27)
Üsteki komut sayesinde “Personeller” tablosundaki identity özelliğine sahip olan kolonu 27den başlatabiliyoruz.
Ancak o yazdığımıza değer veritabanının içindeki değerlerden büyük olmak zorundadır.Yani,en son identity değeri 30 varsayalım ve biz bu komutla 15 yaparsak eğer,insert etme ve bazı durumlarda sorunlar oluşacaktır.
Üstelik pek tavsiye edilen bir yapı değildir.
