直到现在我总是通过使用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”错误?以及如何避免这种情况?
答案 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交互。