本篇的思维导图如下:
外键约束 FOREIGN KEY
保持数据的一致性和完整性
实现一对多的关系
要求
- 父表和字表必须使用相同的存储引擎,并且禁止使用临时表
- 数据表的存储引擎只能为InnoDB
- 外键列和参照列必须具有相似的数据类型。其中数字的长度或是否有符号位必须相同;而字符的长度则可以不同。
- 外键列和参照列必须创建索引,如果外键列不存在索引的话,MySQL将自动创建索引。
编辑数据表的默认存储引擎:
default-storage-engine=InnoDB
举例说明:
//下面创建一个省份列表
CREATE TABLE provinces
(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) NOT NULL
);
//创建另外一个数据表
CREATE TABLE users
(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(10) NOT NULL,
pid SMALLINT UNSIGNED,
FOREIGN KEY (pid) REFERENCES provinces (id));
外键约束的参照操作
- CASCADE: 从父表删除或更新 且自动删除或更新子表中匹配的行
- SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL
- RESTRICT:拒绝对父表的删除或更新操作
- NO ACTION :标准SQL的关键字,在MySQL中与RESTRICT相同
例:
CREATE TABLE users1(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(10) NOT NULL,
pid SMALLINT UNSIGNED,
FOREIGN KEY (pid) REFERENCES provinces (id) ON DELETE CASCADE
);
INSERT provinces(pname) VALUE(