03 Jul

Mysql’de Tekrarlayan (Mükerrer) Kayıt Algılama

Bir tabloda , sadece bir adet aynı nitelikte bir kayıt olmasını istediğimizde , ilgili alan veya alanları “unique” yaparak bunu kolaylıkla yapabiliyoruz. Alanı unique yaptıktan sonra, aynı nitelikte kayıt girmeye çalıştığımızda bize hata döndürür. İşte bu hata ve hata kodunu izleyerek, sistemde tekrarlayan bir kayıt olup olmadığını bulabiliriz .

Örnek olarak bir testdb oluşturalım, sonrasında aşağıdaki sorguları çalıştırarak tablomuzu oluşturalım :

CREATE TABLE `kullanici` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`isim` VARCHAR( 32 ) NOT NULL ,
`nick` VARCHAR( 32 ) NOT NULL ,
`sifre` VARCHAR( 32 ) NOT NULL ,
`eposta` VARCHAR( 32 ) NOT NULL ,
`web` VARCHAR( 32 ) NOT NULL
) ENGINE = InnoDB;

ALTER TABLE `kullanici` ADD UNIQUE(`nick`);
ALTER TABLE `kullanici` ADD UNIQUE(`eposta`);

kullanıcı tablosu oluşturarak , nick ve eposta alanlarımızı unique yapıyoruz. Böylece tablomuzda benzer nick ve eposta kaydedildiğinde bize hata döndürecektir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$pdo =new PDO('mysql:dbname=testdb;host=localhost','root','q1w2e3');
$pdo->setAttribute(Pdo::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql='insert into kullanici values(null,?,?,?,?,?)';

try {
   $stm =$pdo->prepare($sql);
   $stm->execute(array('ersin dogan','ersin','1234','deneme@ersindogan.com','http://ersindogan.com'));
   echo 'Kayıt başarılı';
}catch(PDOException $e) {
   if($e->getCode() ==23000 ) {
      echo 'Bu kullanıcı veya eposta sistemde mevcut<br/>';
   }
   echo '<b>Bir hata oluştu : </b>'. $e->getMessage();
}

Bu kodu ilk çalıştırdığımızda ,bilgiler tabloya kaydedilecek. İkinci defa çalıştırmayı denerseniz, “Bu kullanıcı veya eposta sistemde mevcut” hatasını görürsünüz.

Yukarıdaki koddan da anlaşılabileceği gibi, dönen hata kodu 23000 ise ( bu hata kodu mysql veritabanı ve pdo eklentisine özeldir, başka veritabanlarında bu hata kodu farklı olabilir) , kaydımızın tekrarlayan bir kayıt olduğunu anlayabiliyoruz.

Genelde ilk başladığımız zamanlarda , öncelikle o kaydı veritabanında arar, eğer yoksa kayıt işlemini yapardık. Ama artık daha efektif çözümler mevcut ve bu yöntemleri kullanarak daha kolay çözümler üretebiliriz.

5 thoughts on “Mysql’de Tekrarlayan (Mükerrer) Kayıt Algılama

  1. merhaba bunu pdo sınıfını kullanarak yapmışsınız sınıf kullanmayan yada başka sınıf kullananlar bunu nasıl düzenlicek bu konudada yardımcı olursanız cok sevinirim.

  2. Mysql fonksiyonları ile aşağıdaki şekilde kullanabilirsiniz. Ama size PDO kullanmanızı tavsye ederim. Çok fazla kolaylık sunuyor.

    $c =mysql_connect(‘localhost’,’root’,’q1w2e3′);
    mysql_select_db(‘test’) || die (‘veritabanı secemedi’);

    if(!mysql_query(‘insert into tb_unique values (null,”deneme”,”test için yazıldı”)’)){
    if(mysql_errno()===1062){
    echo ‘Bu kayıt veritabanında mevcut’;
    }
    }
    mysql_close($c);

  3. Merhaba müsadenizle 2 soru olacak
    1-DB tablo tasarımınızda engine=innodb belirlemişsiniz acaba nedenini öğrenebilirmiyim sormamdaki amaç şu
    internette sık sık araştırma yaparım innodb InnoDb dan bazı yerlerde daha performanslı olduğu söyleniyor hoşya oralar nere tam biliyorda değilim.
    2-PDO kullanmayı öneriyorsunuz kolaylık sağladığı aşikar’da acaba performansı nasıl acaba testlerde bulunmuşluğunuz varmı acaba
    Bloğunuzdaki güzel konular için teşekkür ederim

  4. 1- innodb birçok yeni özellik içeriyor (stored procedure, views vb) . Bunun haricinde yazma hızı InnoDb tablolarına göre daha iyi. Burdaki örnekte engine kısmına InnoDB yerine InnoDb da kullanabilirsiniz. Burda böyle yazmamın özel bir sebebi yok, çoğunlukla bu tablo yapısını kullandığımdan alışkanlıktan ileri gelen birşey sanırım.

    2- Performans testi yapmadım, ama sağladığı özellikler göze alındığında, performans kaybı olsa bile böyle kullanılmanızı tavsiye ederim, ayrıca belirgin bir fark olacağını sanmıyorum.

Comments are closed.