创意电子 管理员
  • 最佳新人

    注册账号后积极发帖的会员
  • 活跃会员

    经常参与各类话题的讨论,发帖内容较有主见
  • 1354发帖数
  • 1292主题数
  • 2关注数
  • 9粉丝
开启左侧

discuzX3.4表引擎 MyISAM转换为 InnoDB表pre_forum_post出错

[复制链接]
创意电子 发表于 2022-4-27 14:03:40 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
几乎所有PHP MySQL的开源产品中数据库都是采用MyISAM存储引擎,即使和交易相关的也不例 外,这应该是从查询性能以及安装环境考虑的。InnoDB是为处理巨大数据量时的最大性能设计,在数据量少并发小的情况下MySAM优于INNODB,但 是大数据量以及高并发写入等会导致MySIAM力不从心。

InnoDB有很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等,在并发很多的情况下,InnoDB的表现会比MyISAM优越,所以有时会将一些产品的数据库存储引擎修改为InnoDB,修改 起来其实比较简单,只需要执行:ALTER TABLE `表名` ENGINE = InnoDB;即可,但是在discuz X2.5中表pre_forum_post在转换时会报错,提示#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key,大意是自增字段必须定义成主键
,查看了一下pre_forum_post表可以 看到自增字段position已经是主键(和tid作为联合主键),有些资料提到对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只 有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引,其实这也不完全正确,其实也可以作为联合索引,只是该字段必须是索引的第一个 字段,例如表pre_forum_post设置联合主键使用命令PRIMARY KEY (`tid`,`position`)如果设置索引时使用PRIMARY KEY (`position`,`tid`)问题就解决了,解决方案是重建联合索引,
执行

  1. ALTER TABLE pre_forum_post DROP PRIMARY KEY ,ADD PRIMARY KEY ( position, tid ) ;
复制代码
然后再执行
  1. ALTER TABLE `pre_forum_post` ENGINE = InnoDB
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

猜你喜欢
在线客服QQ
2241998733

24x7小时免费咨询

Powered by 创意电子 ©2018-现在 专注资源实战分享源码下载站联盟商城繁体中文