【发布时间】: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