在 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 中消失的外键的主要内容,如果未能解决你的问题,请参考以下文章