MySQL中的外键?

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安装不包括innodb引擎
  • 你的MySQL配置文件没有启用innodb引擎
  • 您没有使用ENGINE = InnoDB表修饰符声明您的表
  • 外键列与引用表中的主键列的数据类型不完全相同

不幸的是,MySQL没有给出它无法创建外键约束的消息.它只是忽略了请求,并创建了没有外键的表(如果你SHOW CREATE TABLE的帖子,你可能看不到外键声明).我一直认为这是MySQL的一个不好的功能!

提示:整数数据类型的整数参数(例如BIGINT(20))不是必需的.它与存储大小或列的范围无关.无论您给出的参数如何,BIGINT总是相同的大小.如果使用ZEROFILL列修饰符,则数字指的是MySQL将填充列的位数.


DOK*_*DOK 5

有一些代码显示如何自己创建外键,并在 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)