2011-11-30 19 views
11

Şu anda elimde, tablodaki her satırdaki tüm değerleri birleştirdiğim bir dize oluşturuyorum. Bu satırın her satırı için satırın geçerli değerleri (/ durumu) için bir karma değeri almak için kullanıyorum, daha sonra satırın değişip değişmediğini belirlemek için kullanıyorum.mySQL: Her satır için karma değer elde edilsin mi?

Bunu el ile yapmak yerine, mySQL'in her satır için benzersiz bir karma değer elde etmek için yerleşik bir yolu var mı?

cevap

17

Eğer

SELECT MD5(concat(field1, field2, field3, ...)) AS rowhash 

gibi bir şey yapabileceğini ancak uzakta concat(*) bir seçenek (sözdizimi hatası) olmadığı için, istediğiniz alanları listeden alınamıyor.

1

Concat_ws() kullanmak daha iyi. Örneğin. iki bitişik sütun: 12,3 => 1,23.

Üzgünüz, bu hala bazı problemler var. Boş değer hakkında düşünün, boş dize, dize ',', içerebilir ...

Bir null değerindeki null değerindeki null değerindeki (null-mümkün sütunlar için) hash deyimini oluşturmak için bir program gereklidir. Ayrıca nadiren kullanılan char/bayt ayırıcı olarak kullanın.

2

Tam olarak ne istediğinizi yapabileceğiniz ve belki de başkalarının istediği gibi yapabileceğiniz küçük bir betik yaptım ... işte burada ... PHP için ... önce sütunların bir listesini yapmak zorundasınız. Tablonun ardından, her sütun için kendi türüne göre bir "case when" ifadesi yaparsınız ve bunu concat_ws deyimine koyup sha1 ile karıştırırsınız ... Bu yöntemi çok büyük tablolarda (600000+) kullandım kayıtlar) ve tüm kayıtları seçerken hız oldukça iyidir. Ayrıca ben bir concat_ws gerekli verileri Concat ve kullandığınız ne olursa olsun php veya bunu patlamaya daha hızlı olduğunu düşünüyorum, ama bu ... sadece deli bakar

<? 
$query= mysql_query("SHOW COLUMNS FROM $table", $linklive); 
     while ($col = mysql_fetch_assoc($query)) { 
      $columns[] = mysql_real_escape_string($col['Field']); 
      if ($col['Key'] == 'PRI') { 
       $key = mysql_real_escape_string($col['Field']); 
      } 
      $columnsinfo[$col['Field']] = $col; 
     } 
     $dates = array("date","datetime","time"); 
        $int = array("int","decimal"); 
        $implcols = array(); 
        foreach($columns as $col){ 
         if(in_array($columnsinfo[$col]['Type'], $dates)){ 
          $implcols[] = "(CASE WHEN (UNIX_TIMESTAMP(`$col`)=0 || `$col` IS NULL) THEN '[$col EMPTY]' ELSE `$col` END)"; 
         }else{ 
          list($type, $rest) = explode("(",$columnsinfo[$col]['Type']); 
          if(in_array($columnsinfo[$col]['Type'], $dates)){ 
           $implcols[] = "(CASE WHEN (`$col`=0 || `$col` IS NULL) THEN '[$col EMPTY]' ELSE `$col` END)"; 
          }else{ 
           $implcols[] = "(CASE WHEN (`$col`='' || `$col` IS NULL) THEN '[$col EMPTY]' ELSE `$col` END)"; 
          } 
         } 
        } 
        $keyslive = array(); 
        //echo "SELECT $key SHA1(CONCAT_WS('',".implode(",", $columns).")) as compare FROM $table"; exit; 
        $q = "SELECT $key as `key`, SHA1(CONCAT_WS('',".implode(", ",$implcols).")) as compare FROM $table"; 
    ?> 
+8

bir önsezi olduğunu –

İlgili konular