0

到目前为止,我总是通过使用 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”错误而崩溃?我怎么能避免呢?

4

3 回答 3

0

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

于 2013-09-10T07:22:03.020 回答
0

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

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

于 2013-09-10T07:30:27.793 回答
0

尽管几个人可以同时访问该站点,但 MySQL 将按顺序处理表中的插入并将其接收到的请求排队。因此,在插入查询中,如果未提供 ID,则会生成一个自动递增的 ID,然后保存并提交该行。队列中的下一个请求将被处理。自动递增的 ID 不可能如此重复。

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

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

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

于 2013-09-10T07:37:05.150 回答