自动为新记录分配随机字符串

时间:2009-04-14 17:28:43

标签: sql-server random

我已经有了一个客户表,但是从现在开始,必须在新列中为新记录分配一个唯一的5个字符的随机字母数字字符串。无论如何,我可以做到这一点而不必使用Trigger(插入?)

4 个答案:

答案 0 :(得分:2)

调用函数的默认约束最有效。但是,您应该检查要创建的记录数。

虽然5个字符可能足以唯一地标识您的预期记录数(假设AZ,0-9我认为大约有6千万个代码),当您开始随机生成它们时,您可能会发现您点击了{{ 3}}相当快。

答案 1 :(得分:0)

您可以使用默认约束来调用生成随机字符串的函数。

答案 2 :(得分:0)

触发器: 嗯..我会使用触发器 它具有使用以前代码的优势。

但是你也可以创建一个包装你的存储过程 插入表格。

对于唯一的5个字符: 您可以在初始设置上创建一个md5,也许是时间,  然后将它从基数10重新编码为255。

残羹剩饭可以被截断。

答案 3 :(得分:0)

我有类似的情况但是在代码中生成字符串然后将其发送到数据库。当然这用在一张非常小的桌子上,所以我不担心速度。认为它可能会有所帮助,但它假设您使用的是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;
    }