Tus*_*ush 0 mysql database-design primary-key
我必须创建一个表。它的大小将会非常快速地增加。
如果在此处提到的同一时刻触发许多插入查询,是否会有任何问题 -用户名的用户自动增量 ID
我想使用密钥,以便在值达到最大可能值后生成值为 1 的下一个密钥。如何实现?旧数据没有用,所以我可以删除起始行的数据。我知道 UNSIGNED BIGINT 的范围很大,但是有什么方法可以使用触发器创建数据库,以便键重用旧值?尝试编写用户定义的函数来实现这一点有什么缺点?
没有任何方法可以重置自动增量,使其返回到开头并仅覆盖现有数据。自动增量不是这样构建的。
你可以做的是update而不是insert. 您必须使用空白数据预先填充每条记录,以便每个条目始终是一个更新,或者您可以编写一个过程,尝试首先读取下一个 ID,然后相应地插入或更新。无论哪种方式,您都需要自己跟踪下一个 ID,而不是让数据库为您处理它(使用自动增量)。当达到最大值时,将下一个 ID 重置为 1 并继续。
实际思考:
UNSIGNED BIGINT 的最大值是 18,446,744,073,709,551,615。根据您的记录中的内容,您正在查看数千(甚至数百万)PB 的数据。你确定你不会有这么多数据的空间限制吗?您可能会发现您需要做的是清除足够旧的数据,以便在您去数据库时腾出空间。如果你这样做,那么你可以避免预填充并且每次都插入。
如果您定期清除,例如每晚清除,那么您只需要等到剩余数据所在位置与 ID=1 之间的差距足够大,您就不必担心 ID 冲突。发生这种情况时,重新设置您的 ID 并再次从 ID=1 开始插入。如果你这样做,那么你可以回到使用自动增量。
编辑:有关重新播种的其他信息...
OP 在评论中提到在 mysql 中重新播种自动增量列的命令很有趣。此命令将重置起始自动增量值:
ALTER TABLE table AUTO_INCREMENT = 1
Run Code Online (Sandbox Code Playgroud)
我已经读到应该谨慎执行此操作,因为在大表中可能需要很长时间。
另请参阅AUTO_INCREMENT的文档。