【问题标题】:Continually try to insert random unique values into table不断尝试将随机唯一值插入表中
【发布时间】:2014-06-17 02:42:39
【问题描述】:

所以,我有一个以 62 为基数生成随机数的函数,我想尝试在表中插入一个长度为 7 的随机唯一数。我最初在输入值时使行自动递增,但这涉及大量插入、选择和更新行。这是迄今为止不起作用的新代码:

do {
    if (isset($query)) { mysqli_stmt_close($query); }
    $query = mysqli_prepare($connection, "INSERT INTO table1 value1=?");
    mysqli_stmt_bind_param($query, 's', rand_64(7));
} while (!mysqli_stmt_execute($query));
mysqli_stmt_close($query);

我的问题是:这样的事情是否可以实现,或者生成随机数会更好,尝试 SELECT 语句,如果返回的行 == 0,停止循环并插入值?

编辑:我应该注意,如果值是唯一的(即尚未在表中),它会正确插入值,但如果值已经存在,则无法插入。

非常感谢。 :)

【问题讨论】:

  • 你试过ON DUPLICATE KEYINSERT IGNORE吗?
  • 您必须插入其中多少个?这是一次性要求,还是需要反复执行?
  • Fred: ON DUPLICATE KEY 在这种情况下可能不起作用,因为我需要知道生成了什么数字。 Mike:用户正在上传文件,这会用随机字符串生成器重命名它们,以便以后可以链接到它们。最终目标是保持循环并尝试插入,直到没有发生冲突。
  • 'uniqid' 和 'base_convert' 或 'base64_encode' 会做你想做的事吗?

标签: php mysql


【解决方案1】:

这是为表中的每一行分配随机唯一值的简单方法:

SET @r = 0;

UPDATE table1
SET value1 = (@r:=@r+1)
ORDER BY RAND();

您获得从 1 到表中行数的值,但这些值是伪随机分布的,不像自动增量那样增加。

【讨论】:

    【解决方案2】:

    您不能将函数调用的结果或文字绑定到准备好的语句 - 它必须是变量。如果在绑定之前将rand_64() 的返回值分配给变量,则应该会更成功。

    此外,您只需要准备一次查询,这样您就可以将其排除在循环之外。

    这给了你:

    if (isset($query)) { mysqli_stmt_close($query); }
    
    $query = mysqli_prepare($connection, "INSERT INTO table1 set value1=?");
    
    do {
        $rand = rand_64(7)
        mysqli_stmt_bind_param($query, 's', $rand);
    } while (!mysqli_stmt_execute($query));
    
    mysqli_stmt_close($query);
    

    话虽如此,由于您自己生成变量并且可能只需要一次调用数据库,因此此处不使用准备好的语句可能会获得更好的整体性能。

    假设您的 rand_64() 函数不返回任何包含单引号的字符串:

    $success = true;
    do {
        $rand = rand_64(7)
        $query = "INSERT INTO table1 set value1='$rand'";
        if (mysqli_query($connection, $query)) == true) {break;}
        if (mysqli_error($connection) != 1062) {
          $success = false;
          break;
        }
    } while (true);
    

    注意:

    • 我已更正您的 SQL 中的语法错误
    • 您的value1 必须标记为唯一的、非空的。
    • 我没有测试过这段代码。

    【讨论】:

    • 感谢您的帮助。我已经尝试过该代码,它应该可以工作,因为 mysqli_query 返回真/假,对吗?但是当我这样做时,它会将自己置于无限循环中。知道会发生什么吗?
    • 您原来的 SQL 查询是错误的并产生了一个语法错误,因此循环将永远继续下去。我已经更正了我的 sn-p 并添加了一个检查循环以在错误不是重复的情况下中断。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多