在phpMyAdmin中消失外键

时间:2008-11-17 20:10:51

标签: mysql foreign-keys phpmyadmin

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

CREATE TABLE `onlineorder` (
  `receiptid` varchar(10) NOT NULL default '',
  `delivereddate` date default NULL,
  `cid` int(10) NOT NULL,
  `card#` int(10) default NULL,
  `expire` date default NULL,
  PRIMARY KEY  (`receiptid`),
  FOREIGN KEY (receiptid) REFERENCES purchase
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

然而,在创建它之后,我进入phpMyAdmin并导出表。似乎外键约束已经消失。

CREATE TABLE `onlineorder` (
  `receiptid` varchar(10) NOT NULL default '',
  `delivereddate` date default NULL,
  `cid` int(10) NOT NULL,
  `card#` int(10) default NULL,
  `expire` date default NULL,
  PRIMARY KEY  (`receiptid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

phpMyAdmin是否摆脱了外键或我在这里做错了什么?

4 个答案:

答案 0 :(得分:8)

您需要使用InnoDB引擎来获取外键。

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

答案 1 :(得分:6)

使用MyISAM存储引擎定义表时,它接受FOREIGN KEY个约束,但它会默默地将它们抛弃。它解析它们,但不将约束存储在表元数据中,并且随后不能强制执行约束。当你要求查看数据库关于表定义的想法时,它就不知道该约束,正如你已经发现的那样。

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

恕我直言,这对MySQL产品来说是一件可怕的事情。它接受标准SQL而没有错误,让您觉得它将以标准方式支持约束。但事实并非如此!甚至SHOW WARNINGS都没有发现MySQL已经忽略了约束。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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