2009-04-14 8 views

答えて

2

関数を呼び出すデフォルトの制約が最も効果的です。ただし、作成するレコードの数を調べる必要があります。

ランダムに生成すると、birthday paradoxにヒットすることがありますが、5文字は、意図したレコードの数を一意に識別するのに十分な場合があります(AZ、0-9と仮定して約6000万のコード)むしろすばやく。

+0

私はそのアプローチが好きですが、私は顧客テーブルを調べることで関数によって生成された文字列の一意性を検証することはできません。何か案は? – Haoest

+0

一般に、関数にはランダムなコードを生成する固定ループがあり、IF EXISTS(SELECT ...)を実行してコードがすでに使用されているかどうかを判断します。もしあれば、それはループの別の介在を経て、見つかるか、試行が不足してエラーが発生するまで続きます。 – David

0

あなたのランダムな文字列を生成する関数を呼び出すデフォルトの制約を使用することができます。

0

トリガーの場合: トリガーを使用します。 これは、以前のコードを使用する利点があります。

ただし、 の挿入物をテーブルにラップするストアドプロシージャを作成することもできます。ユニークな5文字の場合

: あなたは255

残り物を切り捨てることができベースにベース10からそれを再コーディング、その後 、あなたの最初のセットと、おそらく時間をかけてMD5を作成することができます。

0

私は同様の状況がありましたが、コードに文字列を生成してDBに送信していました。もちろん、これは非常に小さなテーブルで使用されるので、私はスピードを心配する必要はありませんでした。それはあなたがC#を使用していることを前提としていますが、助けになると思っていました。

/// Generates a string and checks for existance 
    /// <returns>Non-existant string as ID</returns> 
    public static string GetRandomNumbers(int numChars, string Type) 
    { 
     string result = string.Empty; 
     bool isUnique = false; 

     while (!isUnique) 
     { 
      //Build the string 
      result = MakeID(numChars); 
      //Check if unsued 
      isUnique = GetValueExists(result, Type); 
     } 
     return result; 
    } 
    /// Builds the string 
    public static string MakeID(int numChars) 
    { 
     string random = string.Empty; 

     string[] chars = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" }; 
     Random rnd = new Random(); 
     for (int i = 0; i < numChars; i++) 
     { 
      random += chars[rnd.Next(0, 35)]; 
     } 
     return random; 

    } 
    /// Checks database tables based on type for existance, if exists then retry 
    /// <returns>true or false</returns> 
    private static bool GetValueExists(string value, string Type) 
    { 
     bool result = false; 

     string sql = ""; 
     if (Type == "URL") 
     { 
      sql = string.Format(@"IF EXISTS (SELECT COUNT(1) FROM myTable WHERE uniqueString = '{0}') 
      BEGIN 
       SELECT 1 
      END 
      ELSE 
      BEGIN 
       SELECT 0 
      END ", value); 
     } 
     //query the DB to see if it's in use 
     result = //ExecuteSQL 

     return result; 
    } 
+0

Oohhh、私はDBレベルでこの機能を実装したいと考えていましたが、その場合はエスカレートする必要があります。 – Haoest