0

我有一个系统可以一次生成一批随机代码,最多 100 个。然后将它们插入数据库。我正在使用代码生成器,并且不太可能再次创建类似的代码,但要确保我想检查数据库是否有重复。我的理论..

  $amount_of_codes


  while ($x != $amount_of_codes)
    {
    $code = gencode();
    $mysql_check = "SELECT code FROM data WHERE code = '$code'";
    $mysql_check_result = mysql_query($mysql_check);
    $check = mysql_num_rows($mysql_check_result);
     if (!$check)
      {
      mysql_query("INSERT INTO data(code) values('$code')")
      $x++
      } 
    }

看起来很乱,有更好的主意吗?

4

3 回答 3

1

CodeColumn 一个 UNIQUE 约束:

CREATE TABLE Code
(
  Code ..
..
  CONSTRAINT Code_Unique UNIQUE (Code),
..
);

插入时只需要捕获数据库异常/错误,不用担心代码是否已经存在。

于 2012-10-16T09:46:04.400 回答
1

很乱。_ 更重要的是,它还受制于竞争条件,即另一个进程可以在您的检查和插入之间插入该代码。

如果您想避免这种情况,请将代码列设置为唯一键,然后尝试插入它。如果它已经存在,则该原子操作将返回错误或引发异常,您可以检查/捕获。

通过进行尝试后检查,您不会失去任何东西,因为无论如何您都必须进行检查(以防前面提到的竞争条件咬住了您)。但是您获得的是原子性和更简洁的代码。

于 2012-10-16T09:47:06.817 回答
0

非常简单的解决方案,确保您的函数女巫放入代码不会放入已经退出的代码。

基本上:

生成代码

检查代码是否存在

是 -> 生成新代码

否 -> 将代码放入数据库

没时间写剧本对不起

于 2012-10-16T09:51:11.990 回答