在 phpMyAdmin 中消失的外键

Posted

技术标签:

【中文标题】在 phpMyAdmin 中消失的外键【英文标题】:Disappearing Foreign Keys in phpMyAdmin 【发布时间】:2010-09-22 17:48:51 【问题描述】:

我正在 mysql 中创建一个新表,并尝试向其中一个字段添加外键约束。

创建表`在线订单`( `receiptid` varchar(10) NOT NULL default '', `delivereddate` 日期默认为 NULL, `cid` int(10) 非空, `card#` int(10) 默认 NULL, `expire` 日期默认为 NULL, 主键(`receiptid`), FOREIGN KEY (receiptid) REFERENCES 购买 ) 引擎=MyISAM 默认字符集=latin1;

但是,在它创建之后,我进入 phpMyAdmin 并导出表。而且好像外键约束已经消失了。

创建表`在线订单`( `receiptid` varchar(10) NOT NULL default '', `delivereddate` 日期默认为 NULL, `cid` int(10) 非空, `card#` int(10) 默认 NULL, `expire` 日期默认为 NULL, 主键(`receiptid`) ) 引擎=MyISAM 默认字符集=latin1;

phpMyAdmin 是去掉外键还是我在这里做错了什么?

【问题讨论】:

【参考方案1】:

你需要使用 InnoDB 引擎来拥有外键。

参考:http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html

【讨论】:

【参考方案2】:

当您使用 MyISAM 存储引擎定义表时,它会接受 FOREIGN KEY 约束,但会默默地丢弃它们。它会解析它们,但不会将约束存储在表元数据中,因此无法强制执行约束。当您要求查看数据库对表定义的想法时,它对那个约束一无所知,正如您所发现的那样。

CHECK 约束也会发生同样的事情(不管存储引擎如何);它解析语法并接受它,然后忽略它。

恕我直言,这对 MySQL 产品来说是一件可怕的事情。它接受标准 SQL 而没有错误,给您留下的印象是它将以标准方式支持约束。但事实并非如此!甚至SHOW WARNINGS 也没有表明 MySQL 忽略了约束。

如果您使用 InnoDB 存储引擎,它会注意外键约束。

【讨论】:

即使使用 innoDB,导出也不包括外键。 (对我来说) 好的,我想通了。在关系视图下,我在内部关系列中添加了外键。我的错。它应该在下一列中输入。【参考方案3】:

此外,PHPMyAdmin 会删除提取任何约束,直到所有表都已创建并已插入数据。如果您使用 PHPMySql 为您转储表格,您会在文件末尾找到一个包含所有 ADD CONSTRAINT 条目的 UPDATE 表格部分。

【讨论】:

【参考方案4】:

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

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

[视频:设置外键约束][1]

【讨论】:

以上是关于在 phpMyAdmin 中消失的外键的主要内容,如果未能解决你的问题,请参考以下文章

创建外键时,phpmyadmin 中的外键约束失败

如何使用 phpMyAdmin 添加指向同一个表的外键?

phpmyadmin - 如何设置依赖于外键的字段值?

在 phpMyAdmin 中设置外键

Navicat for MySQL 为啥我设置的外键保存后会消失?

将相同的外键添加到 4 行 Laravel