Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Pratik MySQL Kullanım Örnekleri
#1
Bu makalede belki de pek bilinmeyen ancak hayatı kolaylaştıran bazı kullanım şekillerine örnek vermek istiyorum.

ON DUPLICATE KEY UPDATE 
Bu deyim INSERT INTO ile birlikte kullanılır, amacı INSERT edilen kaydın ilgili tabloda DUPLICATE KEY hatasına sebep olması durumunda yani aynı KEY değerine sahip bir kayda denk gelmesi durumunda INSERT işlemi yerine mevcut kaydı güncellemesidir.

Örneğin parametreleri dikey olarak tuttuğumuz bir tablomuz olsun , programımızda parametreleri kaydedip güncellerken önce ilgili parametre var mı yoksa insert varsa update kontrolü yapmak yerine tek komutta işi bitirebilirsiniz.

Örnek tablomuz ;

CREATE TABLE `pbs_param` (
 `param_name` varchar(20) NOT NULL DEFAULT '',
 `value` text,
 PRIMARY KEY (`param_name`)
);

Görüldüğü gibi tablomuzda "param_name" PK olarak tanımlı ,  aşağıda ki SQL ile tablomuza "varsayilan_dil" isimli bir parametreyi ekleyeceğiz varsa da güncelleyeceğiz.

INSERT INTO pbs_param (param_name,value) VALUES ("varsayilan_dil" , "tr") ON DUPLICATE KEY UPDATE value="tr" ;

bu cümle "varsayilan_dil" isimli bir parametre yoksa ;

INSERT INTO pbs_param (param_name,value) VALUES ("varsayilan_dil" , "tr") ;

eğer "varsayilan_dil" isimli bir parametre varsa da aşağıdaki gibi çalışma sağlayacaktır.

UPDATE pbs_param SET value="tr" WHERE param_name="varsayilan_dil";

ON DUPLICATE KEY UPDATE den sonra güncellemek istediğiniz alanları virgül ile ayırarak artırabilirsiniz.


WITH ROLLUP
İstatistiksel bir yapıdır, sonuç setimize dikey olarak ara toplam ve genel toplam ekler.

Örnek tablomuz ;

create table t(d date, id int, hrs int);

Örnek verilerimiz ;

insert into t values  
('2013-10-1',1,5), ('2013-10-1',2,6), ('2013-10-1',3,2), ('2013-10-1',3,5),  
('2013-10-2',1,1), ('2013-10-2',1,2), ('2013-10-2',2,3), ('2013-10-2',2,4),  
('2013-10-3',1,2), ('2013-10-3',1,2), ('2013-10-3',1,2);  

Kullanım ;

select d ,id,sum(hrs) as saat
from t  
group by d,id  
with rollup;

Kullanım sonucunda aşağı daki görüntüyle karşılaşılır ;

mysql_makale1.png

Daha anlaşılır bir görüntü sağlamak için "id" sahalarının NULL geldiği satırlara "GÜN TOPLAMI"  , "d" sahasının NULL geldiği satırada "GENEL TOPLAM" diyebiliriz.

select d ,
IF(IFNULL(d,"")="" , "GENEL TOPLAM" , if(IFNULL(id,0)=0,"GÜN TOPLAMI",id)) as id,sum(hrs) as saat
from t  
group by d,id  
with rollup;

mysql_makale2.png
Cevapla
#2
on duplicate key hayat kurtarıyor Smile 
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#3
Oldukça yararlı bilgiler Volkan hocam, özellikle, yakup beyin bahsettiği gibi "on duplicate key" bir çok gereksiz sorgu yazmaktan kurtarıyor insanı.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#4
On duplicate'i ben de bilmiyordum. Harika oldu! Eline sağlık Volkan Bey.
There's no place like 127.0.0.1
WWW
Cevapla
#5
İki ekleme de ben yapayım:

INSERT IGNORE: Eğer DUPLICATE KEY hatası oluşacak bir INSERT yaparsanız hiç bir işlem yapmasın. Yani daha önce var olan bir kayıt eklediğinizde hiç birşey yapmasın, hata da vermesin(Aslında WARNING üretir!)

REPLACE: DUPLICATE KEY hatası oluşursa eskisini sil, yenisini ekle.

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
There's no place like 127.0.0.1
WWW
Cevapla
#6
(07-09-2016, Saat: 14:42)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olİki ekleme de ben yapayım:

INSERT IGNORE: Eğer DUPLICATE KEY hatası oluşacak bir INSERT yaparsanız hiç bir işlem yapmasın. Yani daha önce var olan bir kayıt eklediğinizde hiç birşey yapmasın, hata da vermesin(Aslında WARNING üretir!)

REPLACE: DUPLICATE KEY hatası oluşursa eskisini sil, yenisini ekle.

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Çok tehlikeli komutlar bunlar, duplicate key hatası oluşumunu görmeden üzerine direk yazdırılırsa telafi edilemeyecek hatalar oluşabilir dikkatli kullanmak lazım.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#7
Bir ilave daha ;

Bazen bir tablonun tamamen aynısından başka bir tablo oluşturmaya ihtiyacımız olabilir (indexler , yabancı anahtarlar , trigger'lar) böyle bir durumda aşağıdaki yapı oldukça kullanışlıdır.

CREATE TABLE yeni_tablo_adi LIKE kopyalanacak_tablo_adi;
// Eğer verileride istiyorsak devamına ,
INSERT INTO yeni_tablo_adi SELECt * FROM kopyalanacak_tablo_adi;

İyi çalışmalar.
Cevapla
#8
mysql den çok söz edilince az önce forum mysql too many connections uyarısı verdi  Big Grin

“Do. Or do not. There is no try.”
Cevapla
#9
(10-11-2016, Saat: 15:19)masteryoda Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olmysql den çok söz edilince az önce forum mysql too many connections uyarısı verdi  Big Grin

İyi bir şey gibi... ("too many connections" çok fazla bağlantı yapıldı)  Smile
Tabi bu işin espirisiydi. Form daha önce farklı bir hosting'de yayın yapıyordu. Orada bu tip bağlantı sorunları olmuyordu. 
Şu anki mevcut hosting'imizde ara sıra bağlantı hataları oluşuyor.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#10
(10-11-2016, Saat: 15:34)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(10-11-2016, Saat: 15:19)masteryoda Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olmysql den çok söz edilince az önce forum mysql too many connections uyarısı verdi  Big Grin

İyi bir şey gibi... ("too many connections" çok fazla bağlantı yapıldı)  Smile
Tabi bu işin espirisiydi. Form daha önce farklı bir hosting'de yayın yapıyordu. Orada bu tip bağlantı sorunları olmuyordu. 
Şu anki mevcut hosting'imizde ara sıra bağlantı hataları oluşuyor.

Bu akşamda bolca bu hata ile karşılaştık. Daha önce de CPU aşımı hatası vardı. Ne hikmetse sözde aşırı yüklenme olan bu hatalar sırasında sitede ziyaretiler dahil ~10 adet kullanıcı anca vardı. Forum ne ziyaretçiler gördü.
Anlayacağınız klasik Hostinger. Suni aşırı yüklenme uyarısı ile "paketin yetmiyor üst pakete geç" mesajı.
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  MySQL vs MariaDB. Hangisi tercih edilmeli? uparlayan 4 343 18-06-2018, Saat: 15:14
Son Yorum: vkamadan
  MySQL - SQL Tablo Kontrolü hyperxman 3 213 26-05-2018, Saat: 13:11
Son Yorum: hyperxman
  Soru : MySQL Veritabanı' nda Explode İşlemi Nasıl Yapılır mad85 9 567 22-03-2018, Saat: 21:48
Son Yorum: uparlayan
  MySQL SP recover.. mcuyan 6 408 06-01-2018, Saat: 17:07
Son Yorum: mcuyan
Question MySQL ve MsSQL Md5 Fonksiyon Sonuçları Eşleşmiyor frmman 6 469 22-12-2017, Saat: 09:25
Son Yorum: frmman



Konuyu Okuyanlar: 1 Ziyaretçi