2011-11-30 7 views
11

現在、テーブルの各行のすべての値を連結する文字列を手動で作成しています。私は、行の現在の値(/状態)のハッシュ値を取得するために、各行に対してこの文字列をハッシングしています。これは、後で行が変更されたかどうかを判断するために使用しています。mySQL:各行にハッシュ値を取得しますか?

これを手動で行うのではなく、各行に一意のハッシュ値を取得するためのmySQLの組み込み方法がありますか?

答えて

17

あなたは

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

ような何かを行うことができますが、あなたは離れてconcat(*)はオプション(構文エラー)ではないとして、あなたが望むフィールドのリストから取得することはできません。

1

concat_ws()を使用する方が良いです。例えば隣接する2列:12,3 => 1,23。

申し訳ありませんが、これにはまだ問題があります。

NULL値をNULL値に置き換える必要があるhash文を生成するプログラムが必要です。また、NULL値を空文字列に含めることもできます。あまり使用されないchar/byteもセパレータとして使用してください。

2

まあ私はあなたが望むものを何とかしようとする可能性のある小さなスクリプトを作ってくれました。そして他の人たちが望むものを... ... PHPの場合は... まず列のリストを作成する必要がありますそれぞれの列の型に基づいて "case when"ステートメントを作成し、concat_wsステートメントに入れてsha1でハッシュします。このメソッドは非常に大きなテーブル(600000+レコード)とすべてのレコードを選択するときの速度はかなり良いです。また、私はそれがCONCAT_WSに必要なデータをCONCATし、使用しているものは何でもPHPやでそれを爆発的に高速であると思いますが、それは...ちょうど非常識に見える

<? 
$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

予感です –

関連する問題