核心 DedeCMS 数据表结构
在执行任何 SQL 操作之前,了解其核心表结构是第一步,以下是 DedeCMS 最常用的一些数据表及其用途:

数据表前缀 (默认 dede_) |
表名 (默认) | 主要用途 |
|---|---|---|
dede_ |
archives |
文章主表,存储所有文章的基本信息,如 ID、标题、 typeid (栏目ID)、pubdate (发布时间) 等。 |
dede_ |
addonarticle |
文章副表,存储文章的详细内容,如 body 字段,主副表分离是为了提高查询效率。 |
dede_ |
arctype |
栏目表,存储网站栏目的信息,如 ID、typename (栏目名)、reid (父栏目ID)、ispart (是否频道) 等。 |
dede_ |
arcrank |
文档级别表,定义了文章的权限级别,如“仅站长可见”、“推荐”、“待审核”等。 |
dede_ |
admin |
管理员表,存储管理员账号、密码和权限信息。 |
dede_ |
member |
会员表,存储会员账号、密码和相关信息。 |
dede_ |
tagindex / taglist |
标签表,tagindex 存储标签名称和引用次数,taglist 存储标签与文章的关联关系。 |
dede_ |
uploads |
附件/附件表,记录上传的图片、文档等信息。 |
重要提示:
- 在操作前,务必备份数据库!这是防止误操作导致数据丢失的唯一有效方法。
- 修改表前缀:如果你的网站安装时修改了默认的表前缀(
mycms_),请将所有 SQL 语句中的dede_替换为你自己的前缀。
常用 SQL 操作场景与示例
以下是一些在 DedeCMS 网站管理和维护中非常常见的 SQL 操作。
场景 1:批量修改文章内容或标题
需求:将所有文章标题中的“旧网站”替换为“新网站”。
SQL 语句:

UPDATE dede_archives SET title = REPLACE(title, '旧网站', '新网站');
UPDATE:更新数据的命令。dede_archives:要操作的表。SET title = ...:指定要更新的字段是title,并设置新的值。REPLACE():MySQL 的内置函数,用于字符串替换。
需求:将所有文章内容中的 http://old-domain.com 替换为 https://new-domain.com。
UPDATE dede_addonarticle SET body = REPLACE(body, 'http://old-domain.com', 'https://new-domain.com');
- 注意:文章内容存储在
addonarticle表的body字段中。
场景 2:批量修改文章所属栏目
需求:将 ID 为 10 的栏目下的所有文章,移动到 ID 为 20 的栏目下。
SQL 语句:
UPDATE dede_archives SET typeid = 20 WHERE typeid = 10;
UPDATE dede_archives SET typeid = 20:将archives表中的typeid字段更新为 20。WHERE typeid = 10:这是一个条件,表示只更新那些typeid原来为 10 的记录。
场景 3:批量删除某个栏目下的所有文章
警告:此操作不可逆,请务必先备份数据库!

需求:删除 ID 为 5 的栏目下的所有文章。
SQL 语句:
DELETE FROM dede_archives WHERE typeid = 5;
DELETE FROM dede_archives:从archives表中删除数据。WHERE typeid = 5:条件,只删除typeid为 5 的文章记录。
注意:这个操作只会删除 archives 表中的记录,为了彻底清理,你可能还需要删除 addonarticle、taglist 等相关表中的数据。
-- 删除文章副表数据 DELETE FROM dede_addonarticle WHERE aid IN (SELECT id FROM dede_archives WHERE typeid = 5); -- 删除标签关联数据 (可选) DELETE FROM dede_taglist WHERE typeid = 5;
场景 4:批量修改文章发布时间
需求:将所有在 2025 年 1 月发布的文章,修改为 2025 年 12 月 31 日发布。
SQL 语句:
UPDATE dede_archives SET pubdate = UNIX_TIMESTAMP('2025-12-31 00:00:00') WHERE FROM_UNIXTIME(pubdate, '%Y-%m') = '2025-01';
UNIX_TIMESTAMP():将日期字符串转换为 Unix 时间戳,DedeCMS 内部使用时间戳存储日期。FROM_UNIXTIME():将 Unix 时间戳转换为可读的日期格式,用于WHERE条件判断。
场景 5:批量添加或修改栏目
需求:添加一个新的顶级栏目。
SQL 语句:
INSERT INTO `dede_arctype` (`id`, `reid`, `topid`, `typename`, `typedir`, `isdefault`, `issend`, `ishidden`, `channeltype`, `corank`, `ispart`, `description`, `keywords`, `seotitle`, `moresite`, `siteurl`, `templet`, `sameidlist`) VALUES (NULL, 0, 0, '新栏目名称', '/new/', 0, 0, 0, 1, 0, 0, '', '', '', 0, '', '', '');
INSERT INTO ... VALUES (...):标准的插入数据语句。reid:父栏目 ID,0 表示顶级栏目。topid:顶级栏目 ID,对于顶级栏目,它和id相同,但这里可以设为 0 或留空让数据库处理。typename:栏目名称。typedir:栏目目录,建议以 开头。channeltype模型,1 表示普通文章栏目。
场景 6:查询指定栏目的所有文章 ID 和标题
需求:查询 ID 为 8 的栏目下所有文章的 ID 和标题。
SQL 语句:
SELECT id, title FROM dede_archives WHERE typeid = 8 ORDER BY id DESC;
SELECT id, title FROM ...:选择要查询的字段。ORDER BY id DESC:按 ID 降序排列,最新的文章排在前面。
如何执行 SQL 语句?
在 DedeCMS 环境中,有几种常见的方式来执行 SQL 语句:
-
DedeCMS 后台执行器 (推荐)
- 这是最安全、最方便的方式。
- 登录 DedeCMS 后台 -> 系统 -> SQL命令行工具。
- 在文本框中粘贴你的 SQL 语句。
- 点击“提交”即可执行,系统会返回执行结果。
-
phpMyAdmin (最常用)
- 这是管理 MySQL 数据库的强大工具,通常由你的虚拟主机服务商提供。
- 登录 phpMyAdmin,选择你的 DedeCMS 数据库。
- 点击顶部的 SQL 标签页。
- 在文本框中粘贴你的 SQL 语句。
- 点击“执行”。
-
代码中执行
-
在 DedeCMS 的模板文件或 PHP 文件中,可以通过数据库操作类
dsql来执行。 -
示例代码:
// 引入 common.inc.php 文件以获取 $dsql 对象 // 通常在 include 或 require 的文件中已经包含了 // require_once(dirname(__FILE__)."/include/common.inc.php"); $sql = "UPDATE dede_archives SET title = REPLACE(title, '旧网站', '新网站')"; $dsql->ExecuteNoneQuery($sql); // 执行不返回结果的 SQL (如 UPDATE, DELETE, INSERT) // 如果要查询并获取结果 $sql = "SELECT id, title FROM dede_archives WHERE typeid = 8"; $dsql->SetQuery($sql); $dsql->Execute(); while($row = $dsql->GetArray()){ echo $row['id'] . ' - ' . $row['title'] . '<br />'; }
-
安全注意事项
SQL 注入是 DedeCMS 最常见的安全漏洞之一!
-
永远不要信任用户输入:所有来自用户的数据(如表单提交、URL参数)都应被视为不可信。
-
使用 DedeCMS 内置的安全函数:
-
ReplaceSqlSafe($str):用于过滤 SQL 查询中的特殊字符。 -
HtmlReplace($str):用于过滤 HTML 标签。 -
GetPinyin($str):获取拼音,相对安全。 -
示例:
// 假设 $keyword 来自用户输入 $keyword = isset($_GET['keyword']) ? trim($_GET['keyword']) : ''; $keyword = ReplaceSqlSafe($keyword); // 必须进行过滤! $sql = "SELECT * FROM dede_archives WHERE title LIKE '%".$keyword."%'"; // ... 执行查询
-
-
使用预处理语句 (更高级的安全方式):
dsql类支持预处理,可以有效防止 SQL 注入。- 示例:
$sql = "SELECT * FROM dede_archives WHERE title LIKE ?"; $dsql->SetQuery($sql); $dsql->Execute('s', '%'. $keyword .'%'); // 's' 表示字符串类型 while($row = $dsql->GetArray()){ // ... }
| 操作类型 | SQL 示例 | 关键点 |
|---|---|---|
| 修改数据 | UPDATE dede_archives SET title = REPLACE(title, 'A', 'B'); |
使用 UPDATE 和 REPLACE() 函数 |
| 移动栏目 | UPDATE dede_archives SET typeid = 20 WHERE typeid = 10; |
修改 typeid 字段 |
| 删除数据 | DELETE FROM dede_archives WHERE typeid = 5; |
极其危险,务必备份! |
| 添加数据 | INSERT INTO dede_arctype (...) VALUES (...); |
插入新记录,注意字段匹配 |
| 查询数据 | SELECT id, title FROM dede_archives WHERE typeid = 8; |
使用 SELECT 和 WHERE 条件 |
| 执行工具 | 后台 SQL 工具 / phpMyAdmin | 推荐使用后台工具,安全便捷 |
希望这份详细的指南能帮助你更好地理解和操作 DedeCMS 的数据库。备份是第一要务,安全是永恒的主题。
