不断尝试将随机唯一值插入表中

时间:2014-06-17 02:42:39

标签: php mysql

所以,我有一个在base 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,停止循环并插入值?

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

非常感谢。 :)

2 个答案:

答案 0 :(得分:0)

您不能将函数调用或文字的结果绑定到预准备语句 - 它必须是变量。如果在绑定之前将返回值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必须标记为唯一,非空。
  • 我还没有测试过这段代码。

答案 1 :(得分:0)

这是一种直接的方法,可以为表中的每一行分配一个随机唯一值:

SET @r = 0;

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

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