织梦文档id可以自定义修改吗

不少站长在迁移、合并站点或对接第三方时希望把织梦文档的 id(aid)改成指定值。结论是:技术上可以改,但不建议直接改主键,应该权衡影响后再决定方式。本文详细说明。

一、文档 id 在织梦里的作用

文档 id(aidid)是 dede_archives 表的主键,同时关联多张子表:

改 id 意味着这些关联表都要同步更新,否则文档会出现“正文丢失”“标签丢失”等问题。

二、直接修改 id 的操作步骤

操作前必须完整备份 dede_archives 及所有 addon 表、arctiny 表。

1. 关闭站点或锁定写入

宝塔面板临时停止站点,避免修改期间有新文档写入造成 id 冲突。

2. 改主表 id

UPDATE dede_archives SET id=9999 WHERE id=123;

3. 同步附加表

UPDATE dede_addonarticle SET aid=9999 WHERE aid=123;
UPDATE dede_addonimages  SET aid=9999 WHERE aid=123;
-- 其他模型对应的 addon 表同样处理

4. 同步 arctiny

UPDATE dede_arctiny SET id=9999 WHERE id=123;

5. 同步标签与评论

UPDATE dede_taglist   SET aid=9999 WHERE aid=123;
UPDATE dede_feedback  SET aid=9999 WHERE aid=123;

6. 修改自增起点

如果新 id 大于当前 AUTO_INCREMENT,需要重置:

ALTER TABLE dede_archives AUTO_INCREMENT=10000;

7. 重新生成

修改后旧静态文件路径仍保留,需先删除 /a/ 下旧文件,再 后台 - 生成 - 一键更新

三、为什么不推荐直接改 id

三、推荐替代方案

方案 1:用 URL 路由固定访问地址

不动 id,而是用 Nginx 把指定 URL 转发到当前 id:

location ~* ^/news/special/(\d+)\.html$ {
    rewrite ^/news/special/(\d+)\.html$ /plus/view.php?aid=$1 last;
}

这样对外暴露的 URL 可以是任意自定义路径,内部 id 不变。

方案 2:删除重建

如果只是为了把某篇置顶到指定 id,建议删除旧文档,先调整 AUTO_INCREMENT,再重新发布:

ALTER TABLE dede_archives AUTO_INCREMENT=8888;
-- 然后后台新建文档,会得到 8888 这个 id

方案 3:保留旧 id,做 301 跳转

对已收录的旧 URL 做 301 到新 URL,比直接改 id 更安全:

rewrite ^/a/2026/0729/123\.html$ /a/2026/0729/9999.html permanent;

四、注意事项

如果只是想“让某篇文档有更友好的访问地址”,URL 重写远比改 id 安全;如果是数据合并等刚需,务必在测试环境演练一遍全表同步流程后再上生产。把 id 当成不可变主键对待,能让织梦站点长期可维护、可迁移。