外键约束:foreign key

*外键 foreign key*

    1、概念:如果一个实体的(student)的某个字段,指向(引用)另个实体(class)的主键
(class:class_id),就称为student实体的class_id是 外键 。

  【声名】被指向的实体,称之为主实体(主表),也叫父实体(父表)。class
      负责指向的实体,称之为从实体(从表),也叫子实体(子表)。student

      作用:用于约束处于关系内的实体。

         比如说:我们去一家很火的餐厅吃饭,去餐厅之前我们是在网上预约了位置的客户,与此同时也刚好来了另外一桌未预约的客户,当餐厅恰好空出一个用餐位置。此时餐厅应该先安排在预约名单中客户,而不是未预约的客户。这就是一种约束关系。(例子举得不太好,大佬们见谅哈)

两大限制:
1)增加子表记录时,是否有之对应的父表记录。如果有,则数据插入成功;否则,数据插入失败。
2)在删除或者更新主表记录时,从表应该如何处理相关的记录。

2、定义外键:

在从表上,增加一个 外键字段,指向主表的主键。使用关键字 foreign key

语法:foreign key ([从表]外键字段) 主表名 (关联字段)

3、例子解释

#表一:学生信息表(主表)

CREATE TABLE stu_info (id int(10) primary key auto_increment,name varchar(10) not null,sex  varchar(10),birth varchar(15)) character set utf8;

#表二:学生成绩表(从表)

CREATE TABLE stu_marks (id int(10) primary key auto_increment,CHINESE int (3),MATH int (3),ENGLISH int (3),foreign key (id) references stu_info (id)) character set utf8;       #设置外键约束,foreign key ([从表]外键字段) 主表名 (关联字段)。

【解析】:

设置“外键约束”后的作用,相当于事先建立了一个库,当从表需要插入数据时只能插入 被约束的值,也就是 库 中已经存在的值。

比如我们这边的例子是设置 外键约束 是 id,所以我们在给从表 插入数据时就会有约束,从表 的id值必须是在 主表 中已经存在的,否则报错。

【报错例子】:

报错原因:

    我们给学生成绩表(从表)插入信息时,由于学生信息表(主表)中不存在 id=2016888888 的学生信息,所以插入信息失败。

4、删除操作:

    4.1 删除 ‘从表’ 中的数据:不会影响 主表 的数据

      例子:delete from stu_marks where id=2016030638;

        

   4.2删除 ‘主表’ 中的数据:

        例子:delete from stu_info where id=2015020314;

解析:由于开启了外键约束,会检查外键约束,所以我们无法“删除”或者“更新”主表 stu_info中的数据。

  4.2.3删除/更新 ‘主表’ 中的数据方法:

      1)关闭外键约束检查:set foreign_key_checks=0;

      

   4.2.4禁止删除/更新 ‘主表’ 中的数据:

       1)打开外键约束检查:set foreign_key_checks=1;

原文地址:https://www.cnblogs.com/python-wen/p/10039503.html

时间: 2024-08-27 22:59:07

外键约束:foreign key的相关文章

在数据库的设计中,外键(Foreign key)约束是否真的有必要呢?(一)

已经过去一段时间了.在数据库是否设置外键约束的问题,我和同事发生的争执.我是坚持使用外键约束,他们反对使用外键约束.于是,便有了这篇文章. 这篇文章主要是参考了StackOverFlow网站上的一个话题Are foreign keys really necessary in a databasedesign?(http://stackoverflow.com/questions/18717/are-foreign-keys-really-necessary-in-a-database-desig

mysql 外键(FOREIGN KEY)

互为外键的两个字段必须都是主键 两个表必须是InnoDB表,MyISAM表暂时不支持外键 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以: 外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作. 创建外键的方式: 例子: 1.alter table tb_active add constraint FK_ID foreign key(user_id) REFERENCES tb_user(id); 2.

数据库 SQL 外键约束 多表查询

多表设计与多表查询 1.外键约束        表是用来保存现实生活中的数据的,而现实生活中数据和数据之间往往具有一定的关系,我们在使用表来存储数据时,可以明确的声明表和表之前的依赖关系,命令数据库来帮我们维护这种关系,像这种约束就叫做外键约束.          定义外键约束  foreign key(本表的列名 ordersid) references orders(id)(引用的表明及列名)     create table dept(         id int primary key

mysql数据库,外键约束和表关系

E-R 图 (实体关系模型) E-R图也称实体-联系图(Entity Relationship Diagram), 提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型. 它是描述现实世界关系概念模型的有效方法. 是表示概念关系模型的一种方式. 用"矩形框"表示实体型,矩形框内写明实体名称: 用"椭圆图框"表示实体的属性,并用"实心线段"将其与相应关系的"实体型"连接起来: 用"菱形框"表示实体

使用外键约束

(1) 外键用来在两个表的数据之间建立链接,它可以是一列或者多列(2) 外键是表中的一个字段,它可以不是本表的主键,但对应另一个表的主键(3) 主表(父表):对于两个具有关联的表而言,相关联字段中主键所在的那个表即是主表(4) 从表(子表):对于两个具有关联的表而言,相关联字段中外键所在的那个表即是从表(5) 创建外键的语法:[CONSTRAINT  <外键名>]  FOREIGN  KEY  <字段名>  REFERENCES  <主表名>  <主键列>

MySQL数据库 : 查询语句,连接查询及外键约束

查询指定字段        select 字段1,字段2 from 表名; 消除重复行(重复指的是结果集中的所有完全重复行)             select distinct 字段1,字段2... from 表名 比较运算符(< > != = )            select * from 表名 where id>4 逻辑运算符(and or not in)            select * from 表名 where id>4(条件1) and gender=1

MySQL 外键约束

外键是表中的一个字段,它可以不是本表的主键,但对应另一个表的主键.主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个表即是主表从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表语法:[CONSTRAINT  <外键名>]  FOREIGN  KEY  [字段名]  REFERENCES  <主表名>  主键列

sql数据库删除表的外键约束(INSERT 语句与 FOREIGN KEY 约束&quot;XXX&quot;冲突。该冲突发生于数据库&quot;XXX&quot;,表&quot;XXX&quot;, column &#39;XXX)

使用如下SQL语句查询出表中外键约束名称: 1 select name 2 from sys.foreign_key_columns f join sys.objects o on f.constraint_object_id=o.object_id 3 where f.parent_object_id=object_id('表名') 执行如下SQL语句删除即可. 1 alter table 表名 drop constraint 外键约束名 sql数据库删除表的外键约束(INSERT 语句与 F

FOREIGN KEY 外键约束; UNIQUE和PRIMARY KEY 主键约束、CREATE INDEX建立索引的使用

1)foreign key 是个约束,意思是说如果你给A字段设置了外键约束,以后你要往A字段插入数据,这个数据一定是要在foreign key 后面跟的那个字段中存在的值.这个的意义就是约束了数据的完整性,不会插入错误的数据. 修改添加t_topic外键约束: ALTER TABLE t_topic ADD CONSTRAINT fk_userTopics FOREIGN KEY (user_id) REFERENCES t_users(id) 删除表t_topic外键: ALTER TABLE