-
简述外键约束定义的条件?简述并发控制的正确性准则?求大神解答这两个问题
2012-01-09 19:42:02简述外键约束定义的条件?简述并发控制的正确性准则?求大神解答这两个问题 简答题 不要说太多= =。帮忙归纳一下 谢谢各位大~ -
简述外键约束定义的条件?简述并发控制的正确性准则?求大神解答这两个问题
2012-01-09 15:06:34简述外键约束定义的条件?简述并发控制的正确性准则?求大神解答这两个问题 -
mysql级联删除外键约束_MySQL外键约束、级联更新、级联删除
2020-12-24 09:56:00父表包含原始的字段数据,子表引用父表中该字段的数据,外键约束定义在子表上。1. 外键定义的语法通常在create table和alter table语句中定义外键约束,基本语法如下:[CONSTRAINT [symbol]] FOREIGN KE...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改表。
删除一个外键约束依赖的索引。
创建一个外键约束,引用的表字段暂时还不存在。
参考资料:
-
mysql外键约束语句级连_MySQL外键约束、级联更新、级联删除
2021-01-25 13:38:37父表包含原始的字段数据,子表引用父表中该字段的数据,外键约束定义在子表上。1. 外键定义的语法通常在create table和alter table语句中定义外键约束,基本语法如下:[CONSTRAINT [symbol]] FOREIGN KE...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改表。
删除一个外键约束依赖的索引。
创建一个外键约束,引用的表字段暂时还不存在。
-
restrict 外键约束_主外键和外键约束
2020-12-21 05:52:32外键外键(foreign key) 外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系什么是外键约束右边的DepartmentID是外键。 外键约束是指用于在两个表之间建立关系,需要指定引用主表的哪一列。On ...主外键和外键约束
主键
主键(primary key):一列(或一组列),其值能够唯一区分表中每个行 。
外键
外键(foreign key) 外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系
什么是外键约束
右边的DepartmentID是外键。 外键约束是指用于在两个表之间建立关系,需要指定引用主表的哪一列。
On Delete
On Delete可能取值如上图为:No Action, Cascade,Set Null, Restrict属性。 1. No Action / Restrict 当取值为No Action或者Restrict时,则当在父表(主表)(即外键的来源表)中删除对应记录时,首先检查该记录对应的从表是否有对应外键,如果有则不允许删除。 2. Cascade(级联) 当取值为Cascade时,则当在父表(主表)(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则也删除外键在子表(即包含外键的表)中的记录。(一起删除) 3. Set Null 当取值为Set Null时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。
On Update
On Update可能取值如上图为:No Action, Cascade,Set Null, Restrict属性。(更新的是外键的值)No Action / Restrict 当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许更新。
Cascade(级联) 当取值为Cascade时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则也更新外键在子表(即包含外键的表)中的记录。
Set Null 当取值为Set Null时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。
理解示例
表结构
学生表(学号,姓名,性别,班级) // 学号唯一,能确定学生表的一行课程表(课程编号,课程名,学分) // 课程编号唯一,能确定课程表的一行成绩表(学号,课程号,成绩) // 学号和课程号才能唯一确定哪个人哪门课得了多少分,学号和课程号这两列为主键
具体分析
以上面的成绩表为例,学号和课程号是成绩表的主键,那么学号是成绩表的外键还是学生表的外键?当然是成绩表的外键,因为学号是学生表的主键呀,怎么可能是外键?同理成绩表课程号也应该是成绩表的外键。 其实,外键主要建立与其他表的联系,如果我们想知道成绩表中某一行成绩是谁考的,啥性别,在哪个班级,就可通过成绩表的外键学号与学生表建立一种关系。
-
mysql级联删除外键约束_主外键和外键约束
2021-01-09 20:19:18外键外键(foreign key) 外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系 什么是外键约束 右边的DepartmentID是外键。 外键约束是指用于在两个表之间建立关系,需要指定引用主表的哪一列。...主外键和外键约束
主键
主键(primary key):一列(或一组列),其值能够唯一区分表中每个行 。
外键
外键(foreign key) 外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系
什么是外键约束
右边的DepartmentID是外键。 外键约束是指用于在两个表之间建立关系,需要指定引用主表的哪一列。
On Delete
On Delete可能取值如上图为:No Action, Cascade,Set Null, Restrict属性。 1. No Action / Restrict 当取值为No Action或者Restrict时,则当在父表(主表)(即外键的来源表)中删除对应记录时,首先检查该记录对应的从表是否有对应外键,如果有则不允许删除。 2. Cascade(级联) 当取值为Cascade时,则当在父表(主表)(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则也删除外键在子表(即包含外键的表)中的记录。(一起删除) 3. Set Null 当取值为Set Null时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。
On Update
On Update可能取值如上图为:No Action, Cascade,Set Null, Restrict属性。(更新的是外键的值)
- No Action / Restrict 当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许更新。
- Cascade(级联) 当取值为Cascade时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则也更新外键在子表(即包含外键的表)中的记录。
- Set Null 当取值为Set Null时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。
理解示例
表结构
学生表(学号,姓名,性别,班级) // 学号唯一,能确定学生表的一行 课程表(课程编号,课程名,学分) // 课程编号唯一,能确定课程表的一行 成绩表(学号,课程号,成绩) // 学号和课程号才能唯一确定哪个人哪门课得了多少分,学号和课程号这两列为主键
具体分析
以上面的成绩表为例,学号和课程号是成绩表的主键,那么学号是成绩表的外键还是学生表的外键?当然是成绩表的外键,因为学号是学生表的主键呀,怎么可能是外键?同理成绩表课程号也应该是成绩表的外键。 其实,外键主要建立与其他表的联系,如果我们想知道成绩表中某一行成绩是谁考的,啥性别,在哪个班级,就可通过成绩表的外键学号与学生表建立一种关系。
-
mysql中定义外键约束_Mysql创建外键约束的两种方式
2021-01-18 18:40:55通过给mysql的表字段添加外键约束,可以有效的保持数据的一致性和完整性,数据就不会很容易出问题。1、创建表时直接创建外键约束create table books(bookid number(10) not null primary key,bookName varchar2(20) ... -
Oracle定义约束 外键约束
2012-05-27 23:42:06Oracle定义约束 外键约束 实验详解 -
mysql和sql定义外键约束_SQL外键约束的含义及创建
2021-01-19 22:58:52建立外键约束可以对sql语句的增删改有约束作用。外键取值规则:空值或参照的主键值。(1)插入非空值时,如果主键表中没有这个值,则不能插入。(2)更新时,不能改为主键表中没有的值。(3)删除主键表记录时,你可以在建... -
SQL Server 2012 外键约束(定义外键、删除外键)
2019-04-21 20:00:26文章目录准备知识定义外键使用SSMS工具定义外键使用SQL方式定义外键删除外键使用SSMS工具删除外键方式一:在对象资源管理器中删除主键方式二:在表设计器中删除主键使用SQL方式删除外键 准备知识 外键... -
mysql外键 标记约束语法_「外键约束」外键约束 - seo实验室
2021-02-08 05:46:14外键约束如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键外键(FOREIGN KEY)假设有有A、B两张数据表,A表有一个字段id用来唯一标识A中的一条记录,B表有一个字段a_id来关联A表的一... -
定义外键约束
2019-06-26 18:05:24定义外键约束: from sqlalchemy import ForeignKey 例如: emp_no = Column(Integer, ForeignKey('employees.emp_no', ondelete='CASCADE'), primary_key=True) -
mysql级联删除外键约束_MySQL的外键约束级联删除
2020-12-24 09:56:00这例子的巧妙之处在于,它给子表定义了一个外键约束,从而允许我们在博客文章被删除时自动地删除有欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入在更新数据库时使用外键约束第一个表存储一些简单... -
mysql外键约束案例_SQLServer FOREIGN KEY外键约束讲解及使用实例
2021-02-08 05:47:14FOREIGN KEY约束添加规则1、外键约束并不仅仅可以与另一表的主键约束相链接,它还可以定义为引用另一个表中 UNIQUE 约束的列。2、如果在 FOREIGN KEY 约束的列中输入非 NULL 值,则此值必须在被引用列中存在;否则,... -
mysql怎么给外键约束加名字_Mysql外键约束
2021-01-18 20:31:51目前只有InnoDB引擎类型支持外键约束。InnoDB中外键约束定义的语法如下:[CONSTRAINT [symbol]] FOREIGN KEY[index_name] (index_col_name, ...)REFERENCES tbl_name (index_col_name,...)[ON DELETE reference_op..... -
外键约束
2019-09-27 17:11:34用于定义主表和从表之间的关系: 外键约束要定义在从表上,主表则必须具有主键约束或是unique约束.,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null。 外键的基本语法 foreign key(外键字段)... -
MySQL外键约束
2019-01-28 21:55:02三个条件: ...如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。 设置InnoDB的动作,默认为RESTRICT: 拒绝删除或者更新父表。 ... -
mysql 外键约束多列_MySQL外键约束(FOREIGN KEY)
2021-03-03 20:16:19MySQL外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键的值必须等于另一个表... -
mysql外键约束创建及删除_mysql笔记(12)-外键约束的添加和删除
2021-01-19 14:01:07本文将简单介绍外键的作用,添加/删除外键的方式,以及on ...能预防破坏表之间连接的行为(2) 能防止非法数据插入外键所在的列,因为它必须是它指向的那个表中的值之一二、添加外键约束1、在建表时添加create table ... -
外键及外键约束理解
2018-08-20 20:11:27数据库(外键及其约束理解) 一:首先是外键的定义 如果一个字段X在一张表(表一)中是主关键字,而在另外一张表(表二)中不是主关键字,则字段X称为表二的外键;换句话说如果关系模式R1中的某属性集不是自己的... -
mysql外键约束的作用_MySql外键约束作用
2021-01-19 01:22:05NO ACTION指定如果试图删除/修改某一行,而该行的键被其他表的现有行中的外键所引用,则产生错误并回滚...如果为目标表也定义了级联引用操作,那么指定的级联操作也将应用于删除或更新的那些行。不能为具有 timestam... -
mysql中三个表外键定义_mysql 外键约束
2021-01-28 00:28:57(1) 外键的使用:外键的作用,主要有两个:一个是让数据库自己通过外键来保证数据的完整性和一致性一个就是能够增加ER图的可读性有些人认为外键的建立会给开发时操作数据库带来很大的麻烦.因为数据库有时候会由于没有... -
MySQL外键约束创建及删除创建外键定义(转)
2012-08-14 15:46:36MySQL外键约束创建及删除创建外键定义 : CREATE TABLE categories ( category_id tinyint(3) unsigned NOT NULL AUTO_INCREMENT, name varchar(30) NOT NULL, PRIMARY KEY(category_id) ) ... -
Oracle定义约束 外键约束
2010-03-12 14:44:00外键约束保证参照完整性。外键约束限定了一个列的取值范围。一个例子就是限定州名缩写在一个有限值集合中,这个值集合是另外一个控制结构——一张父表 下面我们创建一张参照表,它提供了完整的州缩写列表,然后使用...