我在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是摆脱外键还是我在这里做错了什么?
您需要使用InnoDB引擎来获取外键.
参考:http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html
使用MyISAM存储引擎定义表时,它接受FOREIGN KEY
约束,但它会以静默方式将它们抛弃.它解析它们,但不将约束存储在表元数据中,并且随后不能强制执行约束.当你要求查看数据库关于表定义的想法时,它对你所知道的约束一无所知.
CHECK
约束也会发生同样的事情(无论存储引擎如何); 它解析语法并接受它,但后来忽略它.
恕我直言,这对MySQL产品来说是一件可怕的事情.它接受标准SQL而没有错误,让您觉得它将以标准方式支持约束.但事实并非如此!甚至没有SHOW WARNINGS
透露MySQL已经忽略了约束.
如果您使用InnoDB存储引擎,它会注意外键约束.