重置/重新排序MySQL wp_posts表中的帖子ID

时间:2014-11-20 作者:user3072613

我有一个相当受欢迎的Wordpress网站。我正在优化网站,然后再添加其他插件,如WPML插件,我怀疑该插件将使用自定义帖子类型。该网站已经有其他插件,我不怀疑这些插件使用wp\\u posts表来定制帖子类型,除了1或2只是为了创建。

Is it possible to rebuild/update/reorder the ID column in the wp_posts table such that the post IDs start from 1 and increase without any gaps.

wp\\u posts表包含3349行。该网站在wordpress wp\\u posts表中包含约412篇帖子(帖子类型)。ID列中的最大数字是7060(这是非常大的),我添加的任何新帖子都会将该数字增加到7061。表中的其余行是其他post类型,例如附件,其中一些是由旧插件创建的。附件帖子类型有2786行,考虑到我将不再使用这些附件,这是一个非常大的数字。412个帖子包含了该网站所需的所有信息。我正在将图像转换为内联SVG和latex。大多数图像都是数字。因此,在所有这些之后,wp\\u posts表中可能有412行。

我知道我可以使用将AUTO\\u增量重置回1;ALTER TABLE tablename AUTO\\u INCREMENT=值
但我不确定如何重新排列帖子ID。我想看看在尝试之前我应该注意哪些预防措施。我认为这对于简化Post-id很重要,因为它们将在多站点中广泛使用。如果有一个解决方案可以在其他表中重新排序和更新对帖子的整个引用,那就太好了!。

我知道这是一个MySQL特性,我必须使用AUTO\\u INCREMENT。

我知道其他帖子类型(如附件)可能包含链接到原始帖子的父id。我不太担心附件,因为我无论如何都想摆脱2786个附件。

我可能会松开标签和类别,但简化帖子ID是至关重要的。我将重建标签和类别无论如何。有没有一种巧妙的方法来保持这些固定。

还有什么我应该担心的危险吗?由于许多脚本/功能将围绕主站点帖子构建,因此我希望在这一点上使帖子ID尽可能唯一。100秒的差距对我来说不是唯一的。

我希望有人能找到完美的解决方案。我在尝试一个非常危险的想法吗?

3 个回复
SO网友:kovshenin

如果您想为您的帖子提供序号,那么不要使用帖子ID列。

AUTO_INCREMENT 是为了提供唯一的数字(和多主机复制中的分割大脑),它永远不会没有间隙,尤其是在WordPress(修订版、自动保存、页面、联系表单、库和一系列其他插件)中,尤其是在InnoDB中。简单的事务失败/回滚可能会导致AUTO_INCREMENT 字段在不插入一行的情况下增加10亿次,这是非常正常的行为。我也会引用塔马斯的话this 堆栈溢出线程:

绝不应依赖自动生成关键帧的数字功能。

从性能的角度来看,这并不重要。A.BIGINT 保持412,aBIGINT 持有7060和aBIGINT 持有50亿的都是64位整数。

如果您想要真正的顺序标识符(用于您的用户体验或任何东西),您应该使用自己的更可预测和隔离的编号逻辑。

SO网友:s_ha_dum

WordPress核心使用该post ID跨多个不同的表交叉链接数据,以及插件可能做的任何事情或主题可能做的任何事情。如果你的网站曾经使用过?p= permalinks。是的,这是一个非常危险的想法。

要正确重置你的帖子ID,你需要做很多工作,但这些工作都是浪费的。WordPress使用an unsigned BIGINT for that field 能够an upper limit of 18,446,744,073,709,551,615. 无论帖子之间有没有“间隙”,你都永远无法到达那里。

此外,每次WordPress创建数据库条目时,您都必须重做这项工作,因为WordPress不会像您(错误地)认为有必要的那样努力保持ID整洁。所以每次WordPress修改数据库时,您都需要重新清理它。这需要编写大量代码才能将系统安装到位,并且需要大量CPU时间来运行它。

SO网友:Mark Kaplun

如果您只关心帖子,那么您可以导出帖子并将其导入到新的DB。我不确定内置的导出器是否存储了帖子ID和附件,因此您可能最终需要编写自己的帖子,如果您只关心帖子内容,这应该不会太难。

问题是,您不应该真正使用内部软件ID作为外部标识符,这对您的健康有害。如果您需要一个唯一的易于记忆的标识符,只需创建自己的元字段并使用它即可。

结束

相关推荐

“NEXT_POSTS_LINK”和“PERVICE_POSTS_LINK”不显示任何内容

我试图在我的单曲中添加“上一篇文章”和“下一篇文章”的链接。php文件没有成功,因为前一个\\u posts\\u link和下一个\\u posts\\u link没有返回任何内容。老实说,我不知道这些按钮放在了什么地方。谢谢<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <div class=\"post-content\"> <?php the_title(