phpmyadmin 导出后缺少外键约束

Posted

技术标签:

【中文标题】phpmyadmin 导出后缺少外键约束【英文标题】:Foreign Key constraints missing after phpmyadmin export 【发布时间】:2013-07-27 06:15:59 【问题描述】:

我使用以下脚本在 mysql 中创建了一个表:

  CREATE TABLE IF NOT EXISTS users_x_activities(
  id int NOT NULL auto_increment, 
  id_user int unsigned NOT NULL,
  id_attivita int unsigned NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (id_user) REFERENCES utente(id),
  FOREIGN KEY (id_attivita) REFERENCES attivita(id)
  ) ENGINE = INNODB;

当我从 phpMyAdmin 导出创建的表时,我得到以下脚本

CREATE TABLE IF NOT EXISTS `users_x_activities` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_user` int(10) unsigned NOT NULL,
  `id_attivita` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id_user` (`id_user`),
  KEY `id_attivita` (`id_attivita`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

所以问题是:我的外键约束在哪里? KEY 是指 FK 吗?似乎在新生成的脚本中不再引用utenteattivita 这两个表。我哪里做错了?

编辑

在phpMyAdmin中,配置表的导出我发现选项“显示外键关系” 如果我标记此选项,我也会在脚本中获得此代码

--
-- RELATIONS FOR TABLE `users_x_activity`:
--   `id_user`
--       `utente` -> `id`
--   `id_attivita`
--       `attivita` -> `id`
--

--
-- Constraints for dumped tables
--

--
-- Constraints for table `users_x_activity`
--
ALTER TABLE `users_x_activity`
  ADD CONSTRAINT `users_x_activities_ibfk_1` FOREIGN KEY (`id_user`) REFERENCES `utente` (`id`),
  ADD CONSTRAINT `users_x_activities_ibfk_2` FOREIGN KEY (`id_attivita`) REFERENCES `attivita` (`id`);

这意味着如果我添加“显示外键关系”选项,我也会获得 FK 约束?在其他情况下不是?

【问题讨论】:

phpmyadmin 不是在 create table 语句之后添加所有表约束,而不是在 create table 语句中?您是否检查了脚本末尾的添加约束命令? @BlaiseSwanwick 我已经编辑了我的问题。在第一个生成的脚本中,我没有获得其他语句。使用新选项,我获得了其他声明(请参阅编辑) 【参考方案1】:

使用 phpmyadmin 管理表时有两种类型的约束:

internal:当您使用 phpmyadmin 设计器设置约束时,例如存储为内部的约束,将不会包含在导出中。 innoDB:这些限制包含在导出中,请查看有关它的链接视频

Setting up a foreign key constraint

【讨论】:

优秀的视频教程!但是有没有办法将数据库类型从 MyISAM 更改为 InnoDB?默认是 myPhpAdmin 中的 MyISAM ...【参考方案2】:

所以问题是:我的外键约束在哪里?

它们是在数据库中定义的。 SHOW CREATE TABLE users_x_activities 的输出将包括外键约束定义。

外键约束的定义可能出现在生成脚本末尾的单独 ALTER TABLE 语句中。

KEY 指的是 FK 吗?

没有。 KEY id_user (id_user) 这里指的是索引。

似乎新生成的脚本中不再引用 utente 和 attivita 这两个表。

是的,你是对的。 CREATE TABLE 语句中不包含外键约束。

我哪里做错了?

MySQL SHOW CREATE TABLE users_x_activities 将包含外键约束。

外键约束可能包含在 phpMyAdmin 生成的脚本中,但在脚本末尾,在单独的 ALTER TABLE 语句中。

【讨论】:

谢谢@spencer。使用显示外键关系(如编辑中所述)我获得生成外键约束的语句? 但是,如果我使用外键和数据导出表,则插入 FK 约束下的数据会失败。如果子表在父表之前填充,则会发生这种情况。但是,如果我在导出时检查没有外键检查,我将得到没有 FK 的表。如何解决? 几个选项。 1)以不违反外键的顺序加载表。 2) 如果您知道这些行不违反任何外键约束,您可以强制 MySQL 在会话中禁用外键检查。执行 SET foreign_key_checks = 0,然后运行插入语句,完成后,通过执行 SET foreign_key_checks = 1 重新启用外键检查(这实质上免除了 MySQL 对数据完整性的任何责任; 会话负责保证完整性。 3) 或者,删除外键,运行插入,然后重新添加外键。 (在大表上重新添加外键可能会花费大量时间,并且在持续时间内持有锁。) 你的意思是什么会话?我说的是有或没有 FK 定义的导出文件。解决方案是如果 FK 定义在所有表定义和插入之后。我可以在phpmyadmin中设置吗?

以上是关于phpmyadmin 导出后缺少外键约束的主要内容,如果未能解决你的问题,请参考以下文章

通过 PhpMyAdmin 的复合外键约束?

由于外键 phpMyAdmin 的约束,BigDump 无法导入

Phpmyadmin 版本 4:关系视图有时不显示外键约束

由于外键约束,使用 phpMyAdmin 复制数据库失败

如何使用phpmyadmin建立外键约束

MySql 重启后:#1452 - 无法添加或更新子行:外键约束失败