过去几周我一直在慢慢学习SQL.我已经学习了所有关系代数和关系数据库如何工作的基础知识.我现在要做的是学习它是如何实现的.
我遇到的一个绊脚石是MySQL中的外键.除了它们存在于MySQL所拥有的InnoDB存储架构中之外,我似乎找不到更多.
在MySQL中实现的外键的简单示例是什么?
这是我写的一个模式的一部分,如果你想指出我的缺点而不是向我展示一个有效的例子,它似乎没有用.
CREATE TABLE `posts` ( `pID` bigint(20) NOT NULL auto_increment, `content` text NOT NULL, `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `uID` bigint(20) NOT NULL, `wikiptr` bigint(20) default NULL, `cID` bigint(20) NOT NULL, PRIMARY KEY (`pID`), Foreign Key(`cID`) references categories, Foreign Key(`uID`) references users ) ENGINE=InnoDB;
Robert Gambl.. 23
假设您的类别和用户表已经存在并且分别包含cID和uID作为主键,这应该有效:
CREATE TABLE `posts` ( `pID` bigint(20) NOT NULL auto_increment, `content` text NOT NULL, `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `uID` bigint(20) NOT NULL, `wikiptr` bigint(20) default NULL, `cID` bigint(20) NOT NULL, PRIMARY KEY (`pID`), Foreign Key(`cID`) references categories(`cID`), Foreign Key(`uID`) references users(`uID`) ) ENGINE=InnoDB;
该references
子句中需要列名.
假设您的类别和用户表已经存在并且分别包含cID和uID作为主键,这应该有效:
CREATE TABLE `posts` ( `pID` bigint(20) NOT NULL auto_increment, `content` text NOT NULL, `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `uID` bigint(20) NOT NULL, `wikiptr` bigint(20) default NULL, `cID` bigint(20) NOT NULL, PRIMARY KEY (`pID`), Foreign Key(`cID`) references categories(`cID`), Foreign Key(`uID`) references users(`uID`) ) ENGINE=InnoDB;
该references
子句中需要列名.
编辑: Robert和Vinko声明您需要在外键约束中声明引用列的名称.这在InnoDB中是必需的,但在标准SQL中,如果父表中的名称相同,则允许省略引用的列名.
我在MySQL中遇到的一个特性是外键声明在几种情况下会无声地失败:
您的MySQL安装不包括innodb引擎
你的MySQL配置文件没有启用innodb引擎
您没有使用ENGINE = InnoDB表修饰符声明您的表
外键列与引用表中的主键列的数据类型不完全相同
不幸的是,MySQL没有给出它无法创建外键约束的消息.它只是忽略了请求,并创建了没有外键的表(如果你SHOW CREATE TABLE的帖子,你可能看不到外键声明).我一直认为这是MySQL的一个不好的功能!
提示:整数数据类型的整数参数(例如BIGINT(20))不是必需的.它与存储大小或列的范围无关.无论您给出的参数如何,BIGINT总是相同的大小.如果使用ZEROFILL列修饰符,则数字指的是MySQL将填充列的位数.