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 
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ı.
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.

https://dev.mysql.com/doc/refman/5.5/en/insert.html
https://dev.mysql.com/doc/refman/5.5/en/replace.html
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ı: İ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.

https://dev.mysql.com/doc/refman/5.5/en/insert.html
https://dev.mysql.com/doc/refman/5.5/en/replace.html

Ç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.
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ı: 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ı:
(10-11-2016, Saat: 15:19)masteryoda Adlı Kullanıcıdan Alıntı: 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
  Mysql DB Hatası powerghost 1 102 09-07-2020, Saat: 09:37
Son Yorum: wiseman
  MYSQL Tunning powerghost 8 482 16-06-2020, Saat: 14:12
Son Yorum: wiseman
  MySQL json sunucu örneği esistem 3 872 25-12-2019, Saat: 11:04
Son Yorum: Halil Han Badem
  MySQL 8.0 Windows x86 (32Bit) Sürümü Download hi_selamlar 9 1.468 10-12-2019, Saat: 17:43
Son Yorum: uparlayan
  MySQL de Aynı tabloda ki 2 farklı alanı kıyaslayan sorgu vkamadan 4 1.023 23-10-2019, Saat: 18:23
Son Yorum: vkamadan



Konuyu Okuyanlar: 1 Ziyaretçi