时间:2024-04-21 浏览量: 收藏
mysql支持外键(foreign key),外键允许跨表交叉引用相关数据,另外外键约束能够保证相关数据的一致性。一个外键关系通常包括一个父表和一个子表。父表包含原始的字段数据,子表引用父表中该字段的数据,外键约束定义在子表上。
1. 外键定义的语法
通常在create table和alter table语句中定义外键约束,基本语法如下:
[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (col_name, ...)
REFERENCES tbl_name (col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
CONSTRAINT symbol 为外键约束名称,如果没有定义,InnoDB表会自动生成一个名称,这个名称在数据库里面必须唯一。
ON DELETE、ON UPDATE表示事件触发时的动作,可设置值为:
CASCADE,更新或者删除父表记录时,子表中的相应记录同步更新或者删除。由级联更新或者删除导致的子表记录修改,不会触发子表的触发器执行。
SET NULL,更新或者删除父表记录时,子表中的相应记录字段设置为NULL,前提是子表中相应字段不能定义为NOT NULL。
RESTRICT,有外键关系约束时,拒绝父表记录的更新和删除操作。
NO ACTION,无动作,实际功能与RESTRICT相同。
SET DEFAULT,仅仅解析器能识别,实际功能未实现。
2. 级联更新和级联删除
当父表对外键关联的字段进行update、delete操作时,子表对应的字段值也会同步变化,称之为级联更新或者级联删除。当外键定义时,设置 referential action 为CASCADE即可实现级联更新与删除。
示例:
foreign key(parent_id) references parent(id) on update cascade
foreign key(parent_id) references parent(id) on delete cascade
foreign key(parent_id) references parent(id) on update cascade on delete cascade
3. 外键约束案例
3.1 外键约束字段值
# 创建父表
create table parent(id int, primary key(id));
# 创建子表
create table child(id int, parent_id int,
foreign key(parent_id) references parent(id),
primary key(id));
子表child会自动在parent_id字段上加上索引。往子表插入数据或者更新数据时,parent_id字段值必须为父表parent中已经存在的值,否则会报错。如下:
Cannot add or update a child row: a foreign key
constraint fails (`db`.`child`, CONSTRAINT `child_ibfk_1`
FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`))
删除父表中有外键约束的记录时,也会报错,如下:
Cannot delete or update a parent row: a foreign key
constraint fails (`db`.`child`, CONSTRAINT `child_ibfk_1`
FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`))
3.2 外键级联更新
# 创建父表
create table parent(id int, primary key(id));
# 创建子表
create table child(id int, parent_id int,
foreign key(parent_id) references parent(id)
on update cascade,
primary key(id));
更新父表parent的id字段值,那么子表字段parent_id中相应的值也会同步更新。
3.3 外键级联删除
# 创建父表
create table parent(id int, primary key(id));
# 创建子表
create table child(id int, parent_id int,
foreign key(parent_id) references parent(id)
on delete cascade,
primary key(id));
删除父表parent的某个id字段值的记录,那么子表字段parent_id中相应值的记录也会同步删除。
3.4 删除外键
alter table child drop foreign key child_ibfk_1;
3.5 创建外键
alter table child add foreign key(parent_id) references parent(id);
4. 外键约束的条件和限制
父表和子表必须为同一种存储引擎,且不能定义为临时表。
创建外键约束需要有REFERENCES权限。
外键约束中使用的字段必须有相似的数据类型,整型的大小必须相同,有无符号也必须相同。字符串类型的长度可以不相同,但是字符集和校验规则必须相同。
外键约束的两个字段可以在同一个表中,但是不能是同一个字段。
外键约束的字段上必须要有索引,以便加快外键检查,如果引用表上的外键字段没有索引的话,MySQL会自动创建一个索引。
不支持外键字段上的前缀索引,blob和text字段不能用于外键。
InnoDB表外键约束不支持分区。
一个有外键约束的表不能修改其存储引擎。
外键约束不能引用虚拟字段。
5. 禁用外键检查
MySQL通过变量 foreign_key_checks 来开启或者禁用外键检查,这个变量作用范围可以是全局,也可以是会话级别。有些场景,禁用外键检查是非常有用的,比如:删除一个有外键约束引用的表。
以不同的顺序重新加载表,比如使用mysqldump导出的表,顺序与外键约束的依赖顺序不一致时,先禁用外键检查,等待表导入完成后,再打开外键检查。
执行load data操作时,关闭外键检查,提高性能。
在一个有外键约束的表上执行alter table改表。
删除一个外键约束依赖的索引。
创建一个外键约束,引用的表字段暂时还不存在。
RELATED RECOMMEND
2024-04-21
常用命令:启动MySQL服务:net start mysql停止MySQL服务:net stop mysql登录数据库:mysql -u db_name -p“-u”表示用户名“-p”表示密码“–h localhost”可省略“-h”表示服务器名,localhost指本机“-P 3306”表示默认端口号,可省略退出数据库exitquit\q显示当前服务器版本:SELECT VERSION();显示
2024-04-21
1、什么是PDO? php data object ,php数据对象,PHP 数据对象 (PDO) 扩展为PHP操作多种数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。 注意利用 PDO 扩展自身并不能实现任何数据库功能;必须使用一个 具体数据库的 PDO 驱动 来访问数据库服务。PDO 提供了一个 数据访问 抽象层,这意味着,不管使用
2024-04-21
PHP通过mysqli连接mysql数据库数据库连接的天龙八步:1、连接数据库连接:mysqli_connect2、成功与否判断连接错误号:mysqli_connect_errno连接错误信息:mysqli_connect_error3、选择数据库选择库:mysqli_select_db执行错误号:mysqli_errno执行错误信息:mysqli_error4、设置字符集mysqli_set_c