| 
 
| 让 Discuz! X 3.4 支持 InnoDB: Discuz! X 3.4 InnoDB 支持需要修改三个数据表。 
 Discuz! X 3.4 数据表使用的是 MySQL 的 MyISAM 存储引擎,只有少数几张数据表使用了 Memory 存储引擎,而现在的云数据库都开始不支持 MyISAM 存储引擎了,甚至只支持 InnoDB 一种存储引擎,比如阿里云的云数据库 RDS MySQL 版就只支持 InnoDB 这一种存储引擎,所以,默认情况下阿里云 MySQL 云数据库不能运行 Discuz! X 3.4.
 
 如果将数据库迁移到云数据库,不支持 MyISAM 和 Memory 引擎的云数据库会自动将数据表转成 InnoDB,而无论是主动把 Discuz! X 3.4 数据表转成 InnoDB 引擎的数据表,还是被云数据库自动转成 InnoDB 引擎数据表,wuxiancheng_common_member_grouppm wuxiancheng_forum_post wuxiancheng_forum_postposition 这三个原 MyISAM 数据表会报错,错误信息是 ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key,导致后续操作这三个数据表时出现 ERROR 1146 (42S02): Table '<name>' doesn't exist 的错误,Discuz! X 3.4 访问时也会出现以下错误。
 
 其中 wuxiancheng_ 是数据表前缀,不同网站配置的前缀不同,默认的前缀为 pre_,默认前缀的情况下,这三个数据表分别是 pre_common_member_grouppm pre_forum_post pre_forum_postposition,请以实际配置为准;<name> 是数据表名,<database> 是数据库名,<tid> 是帖子编号,<N> 是一个数字,取决于相关论坛设置。复制代码Discuz! Database Error
(1146) Table '<database>.forum_post' doesn't exist
SELECT * FROM forum_post WHERE tid=<tid> AND position>=1 AND position<<N> ORDER BY position
 要想让 Discuz! X 3.4 支持 InnoDB,需要修改上面说到的这三个数据表。具体方法如下。
 
 一、从支持 MyISAM 存储引擎的数据库导出 Discuz! X 3.4 数据库到一个 SQL 文件中。
 二、用文本编辑软件打开 SQL 文件,搜索 common_member_grouppm,找到创建数据表的语句如下
 
 将 PRIMARY KEY (`uid`,`gpmid`) 中的两个字段对调,也就是说将 PRIMARY KEY (`uid`,`gpmid`) 改成 PRIMARY KEY (`gpmid`, `uid`) 然后保存文件复制代码CREATE TABLE `wuxiancheng_common_member_grouppm` (
  `uid` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `gpmid` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `status` tinyint(1) NOT NULL DEFAULT '0',
  `dateline` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`uid`,`gpmid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
搜索 forum_post,找到创建数据表的语句如下
 将 PRIMARY KEY (`tid`,`position`) 中的两个字段对调,即将 PRIMARY KEY (`tid`,`position`) 改成 PRIMARY KEY (`position`, `tid`) 然后保存文件复制代码CREATE TABLE `wuxiancheng_forum_post` (
  `pid` int(10) unsigned NOT NULL,
  `fid` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `tid` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `first` tinyint(1) NOT NULL DEFAULT '0',
  `author` varchar(15) NOT NULL DEFAULT '',
  `authorid` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `subject` varchar(80) NOT NULL DEFAULT '',
  `dateline` int(10) unsigned NOT NULL DEFAULT '0',
  `message` mediumtext NOT NULL,
  `useip` varchar(15) NOT NULL DEFAULT '',
  `port` smallint(6) unsigned NOT NULL DEFAULT '0',
  `invisible` tinyint(1) NOT NULL DEFAULT '0',
  `anonymous` tinyint(1) NOT NULL DEFAULT '0',
  `usesig` tinyint(1) NOT NULL DEFAULT '0',
  `htmlon` tinyint(1) NOT NULL DEFAULT '0',
  `bbcodeoff` tinyint(1) NOT NULL DEFAULT '0',
  `smileyoff` tinyint(1) NOT NULL DEFAULT '0',
  `parseurloff` tinyint(1) NOT NULL DEFAULT '0',
  `attachment` tinyint(1) NOT NULL DEFAULT '0',
  `rate` smallint(6) NOT NULL DEFAULT '0',
  `ratetimes` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `status` int(10) NOT NULL DEFAULT '0',
  `tags` varchar(255) NOT NULL DEFAULT '0',
  `comment` tinyint(1) NOT NULL DEFAULT '0',
  `replycredit` int(10) NOT NULL DEFAULT '0',
  `position` int(8) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`tid`,`position`),
  UNIQUE KEY `pid` (`pid`),
  KEY `fid` (`fid`),
  KEY `dateline` (`dateline`),
  KEY `invisible` (`invisible`),
  KEY `displayorder` (`tid`,`invisible`,`dateline`),
  KEY `first` (`tid`,`first`),
  KEY `authorid` (`authorid`,`invisible`)
) ENGINE=MyISAM AUTO_INCREMENT=<N> DEFAULT CHARSET=utf8;
搜索 forum_postposition,找到创建数据表的语句如下
 
 将 PRIMARY KEY (`tid`,`position`) 中的两个字段对调,即将 PRIMARY KEY (`tid`,`position`) 改成 PRIMARY KEY (`position`, `tid`) 然后保存文件复制代码CREATE TABLE `wuxiancheng_forum_postposition` (
  `tid` mediumint(8) unsigned NOT NULL,
  `position` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `pid` int(10) unsigned NOT NULL,
  PRIMARY KEY (`tid`,`position`),
  KEY `pid` (`pid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
三、将修改后的 SQL 数据库文件导入到数据库,如果你是要自己转数据表为 InnoDB,则分别运行 ALTER TABLE `<表名>` ENGINE InnoDB; 将每一个数据表转成 InnoDB 存储引擎的数据表,当然,我们也可以批量转存储引擎,这不是本文讨论的重点,就不在此赘述了;如果你使用不支持 MyISAM 甚至只支持 InnoDB 的云数据库,在你导入 SQL 文件时云数据库会自动把存储引擎改成 InnoDB.
 
 经过以上步骤,现在 Discuz! X 3.4 就可以完美支持 InnoDB 了,低于 3.4 版本的 Discuz! 版本理论上讲也一样能改。吴先成提醒大家:Discuz! 官方会在 Discuz! X 3.5 中解决这个问题,不过 Discuz! X 3.5 跳票了,正式版不知道什么时候能发布,不着急的话可以耐心等待官方发布。
 
 Discuz! X 3.5 官方链接
 https://gitee.com/Discuz/DiscuzX/tree/v3.5/
 | 
 |