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 Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
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 Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
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 Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
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 Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.İ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 Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Ç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 Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
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 Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.mysql 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 Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(10-11-2016, Saat: 15:19)masteryoda Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.mysql 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


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  [ÇÖZÜLDÜ] SQLite'dan MySQL'e Aktarma ? Mr.Developer 3 186 22-07-2019, Saat: 20:31
Son Yorum: Mr.Developer
  (ÇÖZÜLDÜ] MySQL Date_format komutu wiseman 1 184 30-05-2019, Saat: 11:30
Son Yorum: wiseman
  MySQL Drop database Yetkisi yhackup 2 366 22-03-2019, Saat: 11:21
Son Yorum: yhackup
  MySQL Workbench Kod Tamamlama Hatası - (Code Completion) hi_selamlar 0 263 23-02-2019, Saat: 11:42
Son Yorum: hi_selamlar
  MySQL malformed trail byte or out of range char yhackup 5 542 31-01-2019, Saat: 09:55
Son Yorum: hi_selamlar



Konuyu Okuyanlar: 1 Ziyaretçi