mysql autoincrement id vs php生成的id

时间:2013-09-10 07:13:01

标签: php mysql

直到现在我总是通过使用php生成ID(varchar 32主键)来存储mysql数据库中的记录,其功能如下:

$id = substr( str_shuffle( abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ), 0, 8 );

但直到现在在mysql DB中我总是使用utf8_bin(区分大小写)现在我正在使用utf8_general_ci(不区分大小写)。

我的数据库中有一个表来存储统计信息,在此表中有数百万条记录。

在这种情况下最好使用:'id int unsigned autoincrement'作为主键?

如果是,可能的话,如果许多用户同时调用sciprt脚本崩溃并出现“重复ID”错误?以及如何避免这种情况?

3 个答案:

答案 0 :(得分:0)

在我看来,使用mysql的自动增量更好,因为你的php脚本现在可以被多个人同时访问。 因此id可能不再是唯一的。 而且我很确定mysql的编程很好,它禁止相同的ID;)

答案 1 :(得分:0)

实际上,您当前的代码存在可能再次生成相同ID的错误。 MySQL生成的id没有这个问题。即使你有理由生成自己的id,我仍然会使用MySQL自动增量整数来表之间的链接,因为它有更好的索引(速度)。

如果您想要隐藏用户的序列,请将其保存在具有唯一索引的单独列中。并执行id生成并插入do while循环,这样如果你碰巧第二次生成相同的id,你可以重试。

答案 2 :(得分:0)

即使有几个人可以同时访问该站点,但MySQL将按顺序处理表中的插入,并将对它收到的请求进行排队。因此,在插入查询中,如果未提供ID,则将生成自动递增的ID,然后保存并提交该行。并且将处理队列中的下一个请求。自动递增的ID无法像这样重复。

此外,您的代码会生成随机字符串,而不是唯一字符串。两者之间有很多不同。很有可能生成先前生成的随机字符串序列。

另一方面,自动增量是逐渐增加的顺序,不能确保没有重复键的可能性。因此,始终建议使用自动增量来生成主键,而不是生成自己的主键。

要获取最后生成的MySQL ID,您可以在PHP中插入查询后立即使用mysqli_insert_id(),并在代码中使用它,以便与插入的行进行后续的MySQL交互。