我正在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条答案
按热度按时间2ul0zpep1#
您需要使用InnoDB引擎来拥有外键。
参考编号:http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html
vi4fp9gy2#
当您使用MyISAM储存引擎定义数据表时,它会接受
FOREIGN KEY
条件约束,但会自动将它们舍弃。它会剖析这些条件约束,但不会将条件约束储存在数据表中继数据中,因此无法胁迫执行条件约束。当您要求查看数据库的数据表定义概念时,它对该条件约束一无所知,您已经发现了这一点。同样的事情发生在
CHECK
约束上(不管存储引擎如何);它会解析语法并接受它,但随后会忽略它。恕我直言,这对MySQL产品来说是一件糟糕的事情。它接受标准的SQL而不出错,给你留下的印象是它将以标准的方式支持约束。但事实并非如此!甚至
SHOW WARNINGS
都没有揭示MySQL忽略了约束。如果您使用InnoDB存储引擎,它会注意外键约束。
更新:InnoDB自8.0.16起支持检查约束,发布日期2019-04-25。
j2cgzkjk3#
此外,PHPMyAdmin会移除撷取的所有CONSTRAINTS,直到建立所有数据表并插入数据为止。如果您使用作为PHPMySql来为您倾印数据表,您会在档案的结尾找到UPDATE数据表区段,其中包含所有ADD CONSTRAINT项目。
bkkx9g8r4#
使用phpmyadmin管理表时,有两种类型的约束:
[视频:设置外键约束][1]