我正在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是否摆脱了外键或我在这里做错了什么?
答案 0 :(得分:8)
您需要使用InnoDB引擎来获取外键。
参考:http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html
答案 1 :(得分:6)
使用MyISAM存储引擎定义表时,它接受FOREIGN KEY
个约束,但它会默默地将它们抛弃。它解析它们,但不将约束存储在表元数据中,并且随后不能强制执行约束。当你要求查看数据库关于表定义的想法时,它就不知道该约束,正如你已经发现的那样。
CHECK
约束也会发生同样的事情(无论存储引擎如何);它解析语法并接受它,但后来忽略它。
SHOW WARNINGS
都没有发现MySQL已经忽略了约束。
如果您使用InnoDB存储引擎,它会注意外键约束。
答案 2 :(得分:1)
此外,PHPMyAdmin会删除提取任何CONSTRAINTS,直到创建所有表并插入数据为止。如果您使用PHPMySql为您转储表,您将在文件末尾找到包含所有ADD CONSTRAINT条目的UPDATE表部分。
答案 3 :(得分:0)
使用phpmyadmin管理表时有两种类型的约束:
[视频:设置外键约束] [1]