外键约束
关于外键约束

关于外键约束外键约束外键约束(FOREIGN KEY,缩写FK)是⽤来实现数据库表的参照完整性的。
外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性。
外键是指表中某个字段的值依赖于另⼀张表中某个字段的值,⽽被依赖的字段必须具有主键约束或者唯⼀约束。
被依赖的表我们通常称之为⽗表或者主表,设置外键约束的表称为⼦表或者从表。
举个例⼦:如果想要表⽰学⽣和班级的关系,⾸先要有学⽣表和班级表两张表,然后学⽣表中有个字段为stu_clazz(该字段表⽰学⽣所在的班级),⽽该字段的取值范围由班级表中的主键cla_no字段(该字段表⽰班级编号)的取值决定。
那么班级表为主表,学⽣表为从表,且stu_clazz字段是学⽣表的外键。
通过stu_clazz字段就建⽴了学⽣表和班级表的关系。
【⽰例5】表的外键约束-- 创建⼀个班级表create table class (cno int(4) auto_increment, -- 只有主键才可以⾃增cname varchar(12) not null,room varchar(4),primary key(cno));-- insert into class values (null,'Java001',507);-- insert into class values (null,'Java002',502);-- insert into class values (null,'⼤数据001',401);insert into class values (null,'Java001',507),(null,'Java002',502),(null,'⼤数据001',401);-- 查询数据select * from class-- 创建⼀个学⽣表create table student2(sno int(6) primary key auto_increment,name varchar(12),sex char(1),age int(2),classno int(4),constraint fk_stu2_classno foreign key (classno) references class(cno));desc student2;insert into student2 values(null,'zhangsan','男',23,1);insert into student2 values(null,'lisi','男',24,1);insert into student2 values(null,'wangwu','男',16,2);insert into student2 values(null,'zhaoliu','男',24,4); --delete from class where cno = 1update class set cno = 5 where cno = 2select * from classselect * from student2-- 如果想删除1班,请⼿动的先对1班的学⽣进⾏处理(删除或者清空外键)update student2 set classno = null where classno = 1delete from class where cno = 1-- 希望在更新班级编号的时候,可以直接更新学⽣的班级编号;希望在删除某个班级的时候,清空学⽣的班级编号-- 修改外键设置:外键要修改只能先删除再添加alter table student2 drop foreign key fk_stu2_classno; -- 注意提⽰的问题,其实已经删除了外键alter table student2 add constraint fk_stu2_classno foreign key (classno) references class(cno) on delete set null on update cascade。
foreignkeyconstraint的用法

foreignkeyconstraint的用法外键约束(ForeignKey Constraint)是关系数据库中一种重要的数据完整性约束,它用于定义两个表之间的关系。
外键约束可以确保关联表的数据一致性和完整性,保证数据在插入、更新和删除操作时的正确性。
外键约束的用法主要体现在以下几个方面:1. 关联表之间的数据一致性:外键约束可以确保在关联表之间只能存在合法的关系。
例如,如果我们有一个“订单”表和一个“订单详细”表,订单详细表中的外键约束可以确保每个订单详细记录都必须关联到一个有效的订单。
2. 数据完整性的保证:外键约束可以防止无效的数据插入或更新到关联表中。
如果尝试插入一个在关联表中不存在的外键值,数据库将会拒绝该操作,从而保证了数据的完整性。
3. 数据的联合查询:外键约束可以帮助进行跨表的联合查询。
通过外键关系,我们可以轻松地在关联表之间进行连接,并获取所需的数据。
4. 数据的级联操作:外键约束还可以定义级联操作,从而简化数据的处理。
当主表中的数据发生更新或删除时,外键约束可以自动触发相应的级联操作,如级联更新或级联删除相关的从表数据。
需要注意的是,使用外键约束时应遵循以下几点:1. 所关联的字段类型必须一致:在建立外键约束时,关联字段的数据类型必须匹配。
这样可以确保关联的数据是有效和一致的。
2. 确保关联字段存在索引:为了提高查询性能,应该为关联字段建立索引。
这样在联合查询或关键字匹配时能够更快地定位到所需数据。
3. 考虑性能和安全的平衡:外键约束虽然能够保证数据的一致性和完整性,但也会带来一定的性能开销。
在设计数据库时,需要权衡数据操作的频率和限制的必要性,确保在满足数据完整性的同时,也不影响数据库的性能。
总而言之,外键约束是关系数据库中重要的数据完整性约束,它通过定义表之间的关系,保证数据一致性、完整性和方便的数据处理。
合理使用外键约束可以提高数据质量和操作效率,从而提升数据库系统的整体性能。
创建表的约束条件

创建表的约束条件创建表的约束条件是在数据库中定义表结构时,为了保证数据的完整性和一致性,对表中的数据进行限制和规范的条件。
下面将介绍常见的表约束条件及其作用。
1. 主键约束:主键是用于标识表中每条记录的唯一标识符。
主键约束要求主键的值在表中是唯一的,并且不能为空。
主键可以是单个列,也可以是多个列的组合。
主键约束的作用是保证数据的唯一性和查询的高效性。
2. 唯一约束:唯一约束要求某个或某些列的值在表中是唯一的,但可以为空。
唯一约束的作用是保证数据的唯一性,可以用于限制某个字段的取值范围。
3. 非空约束:非空约束要求某个或某些列的值不能为空。
非空约束的作用是保证数据的完整性,防止出现空值。
4. 默认约束:默认约束是指在插入数据时,如果没有指定某个列的值,那么该列使用默认值。
默认约束的作用是提供默认值,简化数据插入操作。
5. 外键约束:外键约束用于建立两个表之间的关联关系,通过外键可以实现表与表之间的数据一致性和完整性。
外键约束要求外键列的值必须在主表中存在,或者为空。
外键约束的作用是保证数据的一致性和完整性,限制了数据之间的关联关系。
6. 检查约束:检查约束是对某个列的取值进行限制的条件,只有满足条件的数据才能插入或修改。
检查约束的作用是保证数据的合法性和一致性,可以用于限制某个字段的取值范围。
7. 级联约束:级联约束是指在对主表进行更新或删除操作时,自动更新或删除与之关联的从表中的数据。
级联约束的作用是保证关联表之间的数据一致性和完整性。
8. 域约束:域约束是在某个列的取值范围内进行限制的条件。
域约束的作用是保证数据的合法性和一致性,可以用于限制某个字段的取值范围。
9. 长度约束:长度约束是指对某个列的字符长度或数值长度进行限制的条件。
长度约束的作用是保证数据的完整性和一致性,可以用于限制某个字段的长度。
10. 唯一组合约束:唯一组合约束要求某几个列的组合在表中是唯一的。
唯一组合约束的作用是保证多个字段的组合值的唯一性。
check约束的多种用法

check约束的多种用法
约束(constraint)指的是对变量、表、列或数据库中数据的限制条件。
在数据库中,约束可以使用在表的列级别或者表级别上。
以下是约束的多种用法:
1. 主键约束(Primary Key Constraint):用于标识表中唯一性
的一列或多列的组合。
主键约束确保了在列中的值是唯一且非空的。
一张表中只能有一个主键。
2. 外键约束(Foreign Key Constraint):用于确保两个表之间
关系的完整性。
外键约束可以定义在一个表的列上,该列引用了另一个表中的主键。
3. 唯一约束(Unique Constraint):用于确保列中的值是唯一的。
唯一约束允许空值,但是对于非空值,该值必须在整个列中是唯一的。
4. 非空约束(Not Null Constraint):用于确保列中的值不为空。
非空约束要求列中的值不能为 NULL。
5. 检查约束(Check Constraint):用于确保列中的值满足指定的条件。
检查约束允许定义列上的一个或多个条件,只有满足这些条件的值才可以插入到列中。
6. 默认约束(Default Constraint):用于指定列在没有提供值的情况下使用的默认值。
默认约束在插入新行时会自动添加该默认值。
除了上述常见的约束,不同数据库管理系统(DBMS)还可能支持其他类型的约束,如触发器约束、唯一性索引约束等。
每种约束都有其特定的用途和语法,具体应用可以根据数据库系统的文档和指南进行参考和学习。
sql操作数据库(3)--外键约束、数据库表之间的关系、三大范式、多表查询、事务

sql操作数据库(3)--外键约束、数据库表之间的关系、三⼤范式、多表查询、事务外键约束在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)在已有表中添加外键约束:alter table 从表表名 add constraints 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)删除外键语法: alter table 从表表名 drop foreign key 外键名称;级联操作:注意:在从表中,修改关联主表中不存在的数据,是不合法的在主表中,删除从表中已经存在的主表信息,是不合法的。
直接删除主表(从表中有记录数据关联) 会包删除失败。
概念:在修改或者删除主表的主键时,同时它会更新或者删除从表中的外键值,这种动作我们称之为级联操作。
语法:更新级联 on update cascade 级联更新只能是创建表的时候创建级联关系。
当更新主表中的主键,从表中的外键字段会同步更新。
删除级联 on delete cascade 级联删除当删除主表中的主键时,从表中的含有该字段的记录值会同步删除。
操作:-- 给从表student添加级联操作create table student(s_id int PRIMARY key ,s_name VARCHAR(10) not null,s_c_id int,-- constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)CONSTRAINT stu_cour_id FOREIGN key(s_c_id) REFERENCES course(c_id) -- 给s_c_id 添加外键约束ON UPDATE CASCADE ON DELETE CASCADE)insert into student VALUE(1,'⼩孙',1),(2,'⼩王',2),(3,'⼩刘',4);insert into student VALUE(4,'⼩司马',1),(5,'⼩赵',1),(6,'⼩钱',1);-- 查询学⽣表中的记录select * from student;-- 级联操作。
外键约束(20171015)

外键约束先要理清几个概念:1)候选键(Candidate Key):关系中的一个属性组,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了,这样的属性组称作候选键(候选码)。
2)主键(Primary Key):当有多个候选键时,可以选定一个作为主键,选定的候选键称为主键(主码)。
主键唯一标识表中的每行记录。
主键约束有如下特点:每个表中只能有一个主键,主键可以是一列,也可以是多列的组合;主键值必须唯一并且不能为空,对于多列组合的主键,某列值可以重复,但列的组合值必须唯一。
3)外键(Foreign Key):关系R中的一个属性组,它不是R的候选键,但它与另一个关系S 的候选键相对应,则称这个属性组为R的外键(外码)。
关系R称为参照关系(参照表、从表),关系S称为被参照关系(被参照表、主表)。
外键是指一个表(从表)中的一列或列组合,它虽不是该表的主键,但却是另一个表(主表)的主键。
通过外键约束可以为相关联的两个表建立联系,实现数据的引用完整性,维护两表之间数据的一致性关系。
特殊情况下,参照关系和被参照关系可以是同一个关系。
即,特殊情况下,从表和主表可以是同一个表。
参照[引用]关系(Referencing Relation)、子表、从表、外键表、参照[引用]表,这些作为同一术语的同义词使用。
被参照[被引用]关系(Referenced Relation)、父表、主表、主键表、被参照[被引用]表、查找表,这些作为同一术语的同义词使用。
请注意,在英语国家讲数据库的英语文献中,relation有时指“表”,有时指两表之间的联系(relationship)。
指两表之间的relationship时也常用link[链接]。
relationship和relation通常都翻译为关系,但在数据库中两者含义不同。
relationship [关系;联系;关联],在数据库中指不同表之间的数据彼此联系的方法。
创建学生表的外键约束。

创建学生表的外键约束。
创建学生表的外键约束,首先需要创建两个表,一个是学生表,另一个是教师表。
然后在学生表中添加一个外键字段,该字段引用教师表中的主键字段。
以下是创建这两个表及添加外键约束的SQL 语句示例:
1. 创建教师表(teacher):
sql
CREATE TABLE teacher (
teacher_id INT PRIMARY KEY,
teacher_name NVARCHAR(50) NOT NULL
);
2. 创建学生表(student):
sql
CREATE TABLE student (
student_id INT PRIMARY KEY,
student_name NVARCHAR(50) NOT NULL,
teacher_id INT,
FOREIGN KEY (teacher_id) REFERENCES teacher(teacher_id) );
在学生表(student)中,我们添加了一个名为`teacher_id` 的字段,并设置其为外键。
该字段引用教师表(teacher)中的主键字段`teacher_id`。
这样,我们就创建了一个学生表并添加了外键约束。
MySQL中的数据完整性约束与检查方法详解

MySQL中的数据完整性约束与检查方法详解MySQL是目前使用最广泛的关系型数据库管理系统之一,它提供了丰富的数据完整性约束和检查方法,用于确保数据库中的数据始终保持一致性和准确性。
本文将详细介绍MySQL中的数据完整性约束和检查方法,帮助读者更好地理解和应用这些功能。
一、数据完整性约束概述在数据库中,数据完整性是指数据在经过各种操作后,仍然能够满足数据库设计者所定义的一些规则和要求。
数据完整性约束用于确保数据库中的数据按照指定的规则进行插入、修改和删除,从而保证数据的一致性和准确性。
常见的数据完整性约束包括主键约束、外键约束、唯一约束和检查约束。
1. 主键约束主键约束用于标识表中的唯一记录,并确保每条记录都有一个唯一标识。
主键约束可以由一个或多个列组成,用于标识唯一性。
在MySQL中,可以使用PRIMARY KEY关键字来定义主键约束。
例如,创建一个名为employees的表,并定义id作为主键约束:```CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(50),age INT);```2. 外键约束外键约束用于建立表之间的关联,保证数据的一致性。
外键约束要求在一个表中的指定列值必须在另一个表中存在。
在MySQL中,可以使用FOREIGN KEY关键字定义外键约束。
例如,创建一个名为orders的表,并将customer_id列定义为外键约束,参考customers表中的id列:```CREATE TABLE orders (id INT PRIMARY KEY,customer_id INT,order_date DATE,...FOREIGN KEY (customer_id) REFERENCES customers(id));```3. 唯一约束唯一约束用于确保表中指定列的值是唯一的,不允许重复。
唯一约束可以由一个或多个列组成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主-外键约束(FOREIGN KEY)
之前所讲的约束都是针对一张表的约束,那么主-外键约束是针对于两张表的约束。
为什么需要主-外键约束?
前面已经创建了一个person表,book表中的pid对应person表中的pid。
表示该本图书是属于哪个人的。
向book表中插入一行pid为00000000000000000的记录。
很明显,编号为00000000000000000的记录根本不存在,那1002图片怎么可以属于一
个不存在的人呢?如果要想解决这样的问题,就需要使用主-外键约束。
主-外键约束的好处是book.pid的取值必须在person.pid之内。
创建主-外键约束的语法:
再次向book表中插入记录。
测试:删除父表中已经与子表关联的记录。
首先向book表中插入合法数据。
删除person表中pid为’111111111111111111’的记录。
主-外键约束,可以保证两张表的数据完整性,不会出现找不到对应数据的情况。
主-外键约束的注意事项:
●子表的外键必须是主表的主键。
例如:book.pid是相对与person.pid的外键。
那么person.pid必须是主键。
●删除父表记录时,需要先删除子表中相关联的所有记录,然后才能删除父表中
的记录。
例如:要删除person表中pid为111111111111111111的记录,需要
在删除book表中pid为111111111111111111的所有记录后,才能删除。
●删除父表时,需要选删除子表,才能删除父表。
例如:要删除person表,需要
在删除book表之后,才能删除。
可以使用CASCODE CONTRAINT强行删除父表。
但强烈建议大家不要这么使用。
重新创建person表。
向book表中插入记录。
如果希望一个表中的数据在删除时,可以自动删除掉其对应的子表记录,则就可以使用级联删除的操作。
查看book的记录。
子表中与person.pid=’111111111111111111’相关联的记录也被删除了。