【问题标题】:InnoDB tables being made as MyISAMInnoDB 表被制作为 MyISAM
【发布时间】:2011-12-23 08:26:16
【问题描述】:

我使用 phpmyadmin 在本地创建我的数据库表。我将他们的引擎设置为 innoDB 并使用 phpmyadmin 创建外键关系。这一切都在本地工作。

但是,如果我尝试将这些表导出到生产站点,这些表将创建为 MYISAM,并且通过创建列上的索引,它们不会作为外键链接到另一个表。

任何想法为什么会发生这种情况?

要导出表,我只需在 PhpMyAdmin 中转到 Export,这是我在生产站点上运行的查询示例:

CREATE TABLE IF NOT EXISTS `foo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `barId` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `barId` (`barId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


ALTER TABLE `foo`
  ADD CONSTRAINT `foo_ibfk_1` FOREIGN KEY (`barId`) REFERENCES `barTable` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION;

这确实会创建表并在 barId 上创建索引,但表引擎是 myisam 而不是 inno,并且 barId 上没有引用 barTable.id 的外键

【问题讨论】:

  • prod DB 是否支持 InnoDB?
  • +1 @Dave Newton 的回答。键入SHOW ENGINES; 以查看远程服务器端支持哪些数据库引擎。
  • @vic 是的,它支持 InnoDb,我可以手动切换到 inno db
  • 回答第二个问题,MYISAM 不支持外键,这就是为什么你的 ALTER 语句没有创建 FK。如果您的表被正确地创建为 INNODB,则 FK 创建将起作用。接下来——在 phpMyAdmin 中,您是否会转到 prod 服务器上的变量选项卡并查看“默认存储引擎”和“存储引擎”的内容?我还希望您查看 phpMyAdmin 目录中的 config.inc.php 文件,看看那里是否有任何选项强制 MISAM 创建表。待续……
  • ...继续。最后,我希望您从 mysql 控制台运行您的 CREATE 并查看它是否产生任何警告。如果是,请键入 SHOW WARNINGS 以查看它们。您还可以在存储日志的任何位置(在 /etc/my.cnf 中找到)找到这些消息。例如,我的日志在 /var/log/mysqld.log 中。

标签: mysql database foreign-keys phpmyadmin innodb


【解决方案1】:

根据您的说法,生产数据库服务器似乎忽略了那里的 ENGINE=InnoDB 子句。

您是否检查以确保在生产服务器上启用了 InnoDB?

【讨论】:

    猜你喜欢
    • 2012-05-15
    • 2010-11-16
    • 1970-01-01
    • 2016-06-14
    • 2014-02-03
    • 2011-10-14
    • 2010-12-16
    • 2014-02-26
    • 2012-01-13
    相关资源
    最近更新 更多