MySQL veritabanı içine yinelenen girişini önlemek için en iyi yol

5 Cevap php

Ben 3 sütunlu bir tablo var - id (pk), pageid (fk), ad. Ben aynı pageid ve ismi ile, yaklaşık yarısı olan çiftleri ile, tabloya yaklaşık 5000 kayıtları döker bir php komut dosyası var. Pageid ve adının birleşimi benzersiz olmalıdır. Çiftleri php komut dosyası aracılığıyla ben döngü olarak tabloya kaydedilir önlemek için en iyi yolu nedir?

5 Cevap

İlk adım tabloda benzersiz bir anahtar ayarlamak olacaktır:

ALTER TABLE thetable ADD UNIQUE INDEX(pageid, name);

Sonra bir yinelenen olduğu zaman ne yapmak istediğinize karar vermek zorunda. Eğer gerekir:

  1. Bunu görmezden?

    INSERT IGNORE INTO thetable (pageid, name) VALUES (1, "foo"), (1, "foo");
    
  2. Önceden girilen kaydın üzerine?

    INSERT INTO thetable (pageid, name, somefield)
    VALUES (1, "foo", "first")
    ON DUPLICATE KEY UPDATE (somefield = 'first')
    
    
    INSERT INTO thetable (pageid, name, somefield)
    VALUES (1, "foo", "second")
    ON DUPLICATE KEY UPDATE (somefield = 'second')
    
  3. Bazı sayacı güncellemek?

    INSERT INTO thetable (pageid, name)
    VALUES (1, "foo"), (1, "foo")
    ON DUPLICATE KEY UPDATE (pagecount = pagecount + 1)
    

Sen MySQL veritabanı bir Benzersiz endeksi pageid ve ad ayarlayabilirsiniz. Eğer satır eklemek Bu şekilde, PHP tarafından göz ardı edilebilir bir hata, neden olur, ve sadece bir sonraki satıra gidebilirsiniz.

Bu tek satır ekleme varsayar. AKA:

foreach($large_data as $fields)
{
    mysql_query("INSERT INTO TABLE (`Something`) VALUES('".$fields['something']."');
}

Ayrıca mysql ile hatayı göz ardı edebilirsiniz: INSERT INTO TABLE IGNORE ... o, anahtar hata görmezden ekleme atlamak ve bir sonraki hareket edecek.

Mysql noktadan yapabilirsiniz

alter table YOURTABLE add unique index(pageId, name);

Senin ifadeler doğru olduğunu ve sizin yapabileceğiniz php onu yapmak istiyorsanız

$already_done = array();
foreach ($records as $record)
{
   $unique_hash = md5($record['name'].$record['pageId']);
   if (!in_array($unique_hash, $already_done))
   {
      $already_done[] = $unique_hash;
      // sql insert here
   }
}

Bu iki şekilde size sadece iyi yapmalıdır.

You can avoid it before save into table using php.
Use following script into your insert.php file

<?php
 if(isset($_POST['submit'])) 
 { 
  mysql_connect('localhost','root','');       
  mysql_select_db('db_name');  
  $pageid=$_POST['pageId']; 
  $name=$_POST['name'];
  $query=mysql_query("select * from user where pageId='".$pageid."' and name='".$name."' ") or die(mysql_error()); 
  $duplicate=mysql_num_rows($query); 
  if($duplicate==0) 
   {        
     $query1=mysql_query("insert into user values('','".$pageid."','".$name."')")  or die(mysql_error());     
   }      
    else 
   {        
     echo'The name '.$name.' with '.$pageid.' is already present in the user table';
   }
  } 
 ?>

Ayrıntı için: avoid duplicate values storing in table using php