icc*_*cco 23 mysql sql foreign-keys
过去几周我一直在慢慢学习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;
Run Code Online (Sandbox Code Playgroud)
Rob*_*ble 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;
Run Code Online (Sandbox Code Playgroud)
该references子句中需要列名.
Bil*_*win 10
编辑: Robert和Vinko声明您需要在外键约束中声明引用列的名称.这在InnoDB中是必需的,但在标准SQL中,如果父表中的名称相同,则允许省略引用的列名.
我在MySQL中遇到的一个特性是外键声明在几种情况下会无声地失败:
不幸的是,MySQL没有给出它无法创建外键约束的消息.它只是忽略了请求,并创建了没有外键的表(如果你SHOW CREATE TABLE的帖子,你可能看不到外键声明).我一直认为这是MySQL的一个不好的功能!
提示:整数数据类型的整数参数(例如BIGINT(20))不是必需的.它与存储大小或列的范围无关.无论您给出的参数如何,BIGINT总是相同的大小.如果使用ZEROFILL列修饰符,则数字指的是MySQL将填充列的位数.
这有一些代码显示如何自己创建外键,并在 CREATE TABLE 中。
这是其中一个更简单的例子:
CREATE TABLE parent (
id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child (
id INT,
parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id)
ON DELETE CASCADE
) ENGINE=INNODB;
Run Code Online (Sandbox Code Playgroud)