精华内容
下载资源
问答
  • 我们说这是维持关联的参照完整性。 在图形化界面,在 外键 选项卡,只需简单地点击外键栏位来编辑。使用外键的工具栏,能让你创建新的、编辑或删除选择的外键栏位。 添加外键:添加一个外键。 删除外键:...
  • 参照完整性约束(外键约束(Foreign key)) 用户定义完整性约束 参照完整性 属于间规则,用来保持之间的关系,确保插入到表中的数据是有效的。 可以使用外键***foreign key*** 来实现 创建外键 问题:如果不加...

    数据完整性

    数据完整性包括
    实体完整性约束
    域完整性约束
    参照完整性约束(外键约束(Foreign key))
    用户定义完整性约束

    参照完整性

    属于表间规则,用来保持表之间的关系,确保插入到表中的数据是有效的。
    可以使用外键***foreign key*** 来实现

    创建外键

    问题:如果不加约束,学生表,课程表,成绩表是独立的,很可能造成数据不一致的情况,如何解决这一问题呢?

    我们可以为成绩表设置2个外键,学号和课程号。

    为成绩表设置外键:
    1.添加第一个外键sno
    在成绩表的表设计器左侧右击,选择关系,打开外键关系对话框,表和列规范

    在这里插入图片描述
    在这里插入图片描述

    点击保存-是(因为表中有数据)

    2.添加第二个外键cno
    在这里插入图片描述

    3.验证外键的作用
    TO BEGIN WITH(学生表中有五名学生)
    在这里插入图片描述
    FUTHEREMORE(课程表中有三门课程)
    在这里插入图片描述
    LAST (验证外键:修改学号/课程号 为不存在的 比如将01改为09) 提示错误
    在这里插入图片描述
    打开学生表,选中某学生,右击删除(删除失败)
    在这里插入图片描述
    在这里插入图片描述
    删除失败(因为在成绩表中,有对应的成绩,如果想要删除01好学生,则需要删除其对应的成绩)

    设置级联 删除与更新(需要修改外键的设置)

    打开成绩表中的外键 - 表设计其器(学号外键和课程号外键同理操作)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    保存 - 是

    验证级联删除和更新
    再来删除01号学生,右击删除,删除成功
    在这里插入图片描述

    刷新成绩表(即可看到01号学生的成绩被删除)
    在这里插入图片描述

    外键特点

    1.必须先为表创建主键,才能创建外键

    2.一个表可以有多个外键

    展开全文
  • 完整性约束-外键约束

    千次阅读 2021-01-24 16:18:00
    外键约束(FOREIGN KEY,缩写FK)是用来实现数据库表的参照完整性的。外键约束可以使两张紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性。 外键是指表中某个字段的值依赖于另一张表中某个...

    表的完整性约束-外键约束

    • 外键约束(FOREIGN KEY,缩写FK)是用来实现数据库表的参照完整性的。外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性。
    • 外键是指表中某个字段的值依赖于另一张表中某个字段的值,而被依赖的字段必须具有主键约束或者唯一约束。被依赖的表我们通常称之为父表或者主表,设置外键约束的表称为子表或者从表。

    代码示例

    • 先创建一个部门表(父表)
    -- 先创建父表:部门表:
    create table department(
            dno int(4) primary key auto_increment,
            dname varchar(10) not null,
            room char(4)
    )
    • 创建员工表,并添加外键约束外键约束只有表级约束,没有列级约束
    -- 注意:外键约束只有表级约束,没有列级约束:
    -- 方法一:创建表的时候添加外键约束
    create table staff(
            eid int(6) primary key auto_increment, 
            name varchar(5) not null, 
            department int(4),
        	-- 取值参考department表中的dno字段,不要求字段名字完全重复,但是类型长度定义 尽量要求相同。
            constraint fk_staff_department foreign key (department) references department (dno)
    );
    
    -- 方法二:创建完表后添加外键约束
    create table staff(
            eid int(6) primary key auto_increment, 
            name varchar(5) not null, 
            department int(4)
    );
    -- 在创建表以后添加外键约束:
    alter table staff add constraint fk_staff_department foreign key (department) references department (dno)

    外键策略

    • 对于有外键约束的表格,可以设置外键策略来达到在操作父表的时候,子表也响应的作出策略定义的修改

    • 外键策略有三个

      • 策略1:no action 不允许操作
      -- 外键策略 no action
      delete from department where dno = 2;
      -- > 1451 - Cannot delete or update a parent row: a foreign key constraint fails (`mytestdb`.`staff`, CONSTRAINT `fk_staff_department` FOREIGN KEY (`department`) REFERENCES `department` (`dno`))
      -- 默认删除的外键策略是no action 如果删除删除有员工的部门的话,就会出错,不让直接删除
      • 策略2:cascade 级联操作:主表中的数据被修改,那么子表关联的字段也跟着主表一起修改,比如父表中部门编号被修改,那么子表中的部门也会相应的被修改
      -- 先删除之前的外键约束:
      alter table staff drop foreign key fk_staff_department;
      -- 重新添加外键约束:
      alter table staff add constraint fk_staff_department foreign key (department) references department (dno) on update cascade on delete cascade;
      -- on update cascade 与 on delete cascade; 
      -- 表示修改,与删除都设置为级联策略
      -- 那么部门表中,更改了部门编号,子表中部门编号就跟着自动修改,
      -- 要是删除了某个部门,那么这个部门的所有员工信息也都降被删除.
      • 策略3:set null 置空操作:主表数据被修改,那么子表关联的字段设置为空,比如父表中某个部门被删除,设置了set null后,子表中该部门的员工信息部门字段会被设置为null,如果不设置为set null的话,父表部门被删除,子表中该部门的员工信息也同时被删除
      -- 先删除之前的外键约束:
      alter table staff drop foreign key fk_staff_department;
      -- 重新添加外键约束:
      alter table staff add constraint fk_staff_department foreign key (department) references department (dno) on update set null on delete set null;
      -- on update set null  与  on delete set null;
      -- 表示修改,与删除都设置为set null策略
      -- 那么部门表中,更改了部门编号,子表中该部门员工的部门字段都被修改为null,
      -- 要是删除了某个部门,那么这个部门的所有员工部门字段都被修改为null.
    • 一般策略2与策略3搭配进行使用,修改的时候,级联进行修改,删除的时候set null

      -- 先删除之前的外键约束:
      alter table staff drop foreign key fk_staff_department;
      -- 重新添加外键约束:
      alter table staff add constraint fk_staff_department foreign key (department) references department (dno) on update cascade on delete set null;
      -- on update cascade on delete set null;
      -- 表示修改使用级联策略,删除使用set null策略
      -- 那那么部门表中,更改了部门编号,子表中部门编号就跟着自动修改,
      -- 要是删除了某个部门,那么这个部门的所有员工部门字段都被修改为null.
    展开全文
  • MySQL数据库——外键约束

    千次阅读 2019-05-06 16:47:23
    文章目录方案一:单张方案二:两张方案三:两张并添加外键约束 把用户信息及其收货地址保存在数据 方案一:单张 创建 create table user_info( id char(36) primary key, user_name varchar(30) not ...


    把用户信息及其收货地址保存在数据中

    方案一:单张表

    创建表

    create table user_info(
      id char(36) primary key,
      user_name varchar(30) not null,
      password varchar(30) not null,
      real_name varchar(8),
      mobile char(11),
      address varchar(150)
    );
    

    表中的id使用由java工具类生成的UUID保证id的唯一性
    插入数据

    insert into user_info (id,user_name,password,real_name,mobile,address) 
    values ('1e8e8d94-61b3-40b3-8e80-4890119d7c74','appache','123456','Lucy','18920120206','USA');
    
    insert into user_info (id,user_name,password,real_name,mobile,address) 
    values ('e6952417-96f9-4f61-8f8e-a67ff6b4bb69','appache','123456','Tom','18617297545','UE');
    
    insert into user_info (id,user_name,password,real_name,mobile,address)
    values ('e4d4aaf2-6412-41ad-9157-acec294f0b36','appache','123456','Tim','17694976949','Japan');
    

    插入数据后的user_infor表
    由于每个用户可以有多个收货地址,可以看出这种方法创建的表存在较为严重的字段冗余(user_name和password列),而随着该表中的个人信息字段越来越多,则这一问题表现的就越严重,所以不推荐使用。为了解决字段冗余的问题我们可以创建两张表,一张用来保存个人信息,另外一张用来保存收货地址。

    方案二:两张表

    创建表user_info

    create table user_info(
      id char(36) primary key,
      user_name varchar(30) unique not null,
      password varchar(30) not null
    )
    

    插入数据

    insert into user_info (id,user_name,password) values ('1e8e8d94-61b3-40b3-8e80-4890119d7c74','appache','123456');
    

    第一张表插入数据
    创建表address

    create table address(
      id char(36) primary key,
      user_info_id char(36),
      real_name varchar(8) not null,
      mobile char(11) not null,
      address varchar(150) not null
    )
    

    user_info_id对应 user_info表中的id字段
    插入数据

    insert into address (id,user_info_id,real_name,mobile,address) 
    values ('bfb9472a-7911-4e6f-a479-3b719454ebab','1e8e8d94-61b3-40b3-8e80-4890119d7c74','Lucy','18920120206','USA');
    insert into address (id,user_info_id,real_name,mobile,address) 
    values ('5227c6b9-45a2-44aa-8ac0-1f63a38d3b65','1e8e8d94-61b3-40b3-8e80-4890119d7c74','Tom','18617297545','UE');
    insert into address (id,user_info_id,real_name,mobile,address) 
    values ('30b8584b-aa6a-4516-a623-03f487058586','1e8e8d94-61b3-40b3-8e80-4890119d7c74','Tim','17694976949','Japan');
    

    向第二张表中插入数据
    这种方法虽然解决了字段的冗余问题,但由于只是逻辑上的“外键”关系,在插入数据的时候需要靠数据库操作者的自觉性,所以依然无法保证数据完整性,有可能会出现垃圾信息(没有用的信息)存在
    如果这里在向aadress表中添加一条数据并且该数据没有与之对应的用户信息则这里添加的数据就是没有用的信息

    insert into address (id,user_info_id,real_name,mobile,address) values ('7da42cc6-36a6-4ad5-9998-71dbc30c8e17','ddc376dd-f8b3-42a6-b42a-db22abed1941','xiaowang','18338970095','China');
    

    向address表中插入数据
    如果这里如果把user_info表中的数据删除但此时地址表中数据将不再完整,这些地址没有与之对应的用户。此时addres表中与之前用户对应的收货地址成为了垃圾信息。
    把user_info中的数据删除
    address表中的数据依然存在
    这里只是逻辑上的“外键”关系,所以还需要手动删除address表中对应的数据。

    显然逻辑上的"外键"关系需要依靠操作者的自觉性,依然无法保证数据的完整性。

    方案三:两张表并添加外键约束

    创建表user_info

    create table user_info(
      id char(36) primary key,
      user_name varchar(30) not null,
      password varchar(30) not null
    )
    

    插入一条数据

    insert into user_info (id,user_name,password) values ('1e8e8d94-61b3-40b3-8e80-4890119d7c74','appache','123456');
    

    创建表address的同时添加外键约束

    create table address(
      id char(36) primary key,
      user_info_id char(36),
      real_name varchar(8) not null,
      mobile char(11) not null,
      address varchar(150) not null,
      #下面这条语句就是在user_info_id添加了外键,指向user_info表的主键
      foreign key(user_info_id) references user_info(id)
    )
    

    插入数据

    insert into address (id,user_info_id,real_name,mobile,address) 
    values ('bfb9472a-7911-4e6f-a479-3b719454ebab','1e8e8d94-61b3-40b3-8e80-4890119d7c74','Lucy','18920120206','USA');
    insert into address (id,user_info_id,real_name,mobile,address) 
    values ('5227c6b9-45a2-44aa-8ac0-1f63a38d3b65','1e8e8d94-61b3-40b3-8e80-4890119d7c74','Tom','18617297545','UE');
    insert into address (id,user_info_id,real_name,mobile,address) 
    values ('30b8584b-aa6a-4516-a623-03f487058586','1e8e8d94-61b3-40b3-8e80-4890119d7c74','Tim','17694976949','Japan');
    

    这种方案为user_info_id添加了外键,指向user_info表的主键,该约束起到了保护数据完整性的作用:如果删除的用户信息id已经在address表中使用,则该条数据无法删除;无法向address表中添加用户id不存在的地址信息。
    如果向address表中插入无关的信息

    insert into address (id,user_info_id,real_name,mobile,address) values ('7da42cc6-36a6-4ad5-9998-71dbc30c8e17','ddc376dd-f8b3-42a6-b42a-db22abed1941','xiaowang','18338970095','China');
    

    这里会报错

    insert into address (id,user_info_id,real_name,mobile,address) values ('7da42cc6-36a6-4ad5-9998-71dbc30c8e17','ddc376dd-f8b3-42a6-b42a-db22abed1941','xiaowang','18338970095','China')
    > 1452 - Cannot add or update a child row: a foreign key constraint fails (`user_info`.`address`, CONSTRAINT `address_ibfk_1` FOREIGN KEY (`user_info_id`) REFERENCES `user_info` (`id`))
    > 时间: 0.009s
    

    如果这里删除表user_info,也会报错

    #以下两条语句中的任意一条即可
    delete from user_info
    delete from user_info where id = '1e8e8d94-61b3-40b3-8e80-4890119d7c74';
    

    这里也会报错

    delete from user_info
    > 1451 - Cannot delete or update a parent row: a foreign key constraint fails (`user_info`.`address`, CONSTRAINT `address_ibfk_1` FOREIGN KEY (`user_info_id`) REFERENCES `user_info` (`id`))
    > 时间: 0.019s
    

    如果想要向address表中插入数据必须要和user_info_id指向的user_info表中的id相对应,否则无法插入
    如果想要删除user_info表中的数据,必须把指向他的主键对应的数据先全部删除,否则无法删除

    所以这种方案起到了保护数据完整性的作用,推荐使用该方案。


    删除user_info表中的id=1e8e8d94-61b3-40b3-8e80-4890119d7c74数据

    1. 先把address表中user_info_id指向该id的数据删除
    delete from address where user_info_id = '1e8e8d94-61b3-40b3-8e80-4890119d7c74';
    

    结果如下
    删除后的address表
    2. 这时就可以删除user_info表中的数据

    delete from user_infor where id = '1e8e8d94-61b3-40b3-8e80-4890119d7c74';
    

    user_infor表中的数据删除成功

    展开全文
  • 1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。 eg:数据库和应用是一...

    外键存在的两个问题:一是对DB数据完整性和一致性的影响;二是对性能的影响
    优势:
    1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。
    eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢?
    2,有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。
    3,外键在一定程度上说明的业务逻辑,会使设计周到具体全面
    4、数据的一致性会交给数据库验证,代码量小
    缺点:
    1,可以用触发器或应用程序保证数据的完整性
    2,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题
    3,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert,update,delete数据的时候更快)
    4、每次做数据的修改和删除的时候都必须要考虑外键约束,会导致数据的复杂性增加
    5、会降低性能
    5、级联删除问题:多级级联删除会让数据变的不可控,触发器也被严格禁用
    6、数据耦合问题:数据库层面数据关系产生耦合,数据迁移维护困难
    6、并发问题,外键约束会启用行级锁,主表写入时会进入阻塞
    eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不止一个字段有外键,这样扫描的数量是成级数的增长!可能会造成系统的积压,可能还会造成系统的延迟和奔溃的情况
    结论:
    1,在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全自己控制),不用外键;小系统随便,最好用外键。
    2,用外键要适当,不能过分追求
    3,不用外键而用程序控制数据一致性和完整性时,应该写一层来保证,然后个个应用通过这个层来访问数据库

    展开全文
  • 外键约束(FOREIGN KEY,缩写FK)是用来实现数据库表的参照完整性的。外键约束可以使两张紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性。 3、什么是外键? 外键是指表中某个字段的值...
  • 外键是表的一个特殊字段,外键约束是为了保证多个表(通常为两个表)之间参照关系。 设置外键约束的两个表之间具有父子关系,即子表某个字段的取值范围由父表决定。例如,表示一个班级和学生关系,即每个班级有多...
  • 主键所在的为主外键所在的为子,在创建时应先创建主在创建子。应用主键与外键能使两个或多个之间产生关系,进而通过关系查询出想要的数据。主键的作用是保证数据的唯一和非空,使用主键的那个...
  • 约束保证了数据的完整性和一致性。下面这篇文章主要给大家介绍了关于MariaDB数据库外键约束的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
  • ,保持数据一致性,完整性实现一对一或一对多关系。(因为一个只存一类信息。用外键来做参照, 保证数据的一致性,可以减少数据冗余)   外键约束的要求:   数据的存储引擎只能为InnoDB;   外键列和...
  • 数据库外键及其约束理解)

    万次阅读 2019-04-18 10:25:38
    如果一个字段X在一张一)是主关键字,而在另外一张二)不是主关键字,则字段X称为二的外键;换句话说如果关系模式R1的某属性集不是自己的主键,而是关系模式R2的主键,则该属性集称为是关系...
  • 什么是主键、外键 关系型数据库中的一条记录有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。 比如: 学生(学号,姓名,性别,班级) 其中每个学生的学号是唯一...
  • 查看数据库:show databases; 创建数据库:create database 数据库名; 删除数据库:drop database 数据库名; 单行注释–注释内容 多行注释:/内容/ mysql数据类型 1.1数值型:int tinyint微整型 smallint 小整型 1.2...
  • 引言 其实这个话题是老生常谈,很多人在工作...每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便。 坦白说,这么说也是对的。但是呢,不够全面,所以开一文来详细说明。 ...
  • MySQL的外键约束是用来在两个之间建立链接的,其中一个发生变化,另外一个也发生变化。从这个特点来看,它主要是为了保证数据的一致性和完整性的。 对于两个通过外键关联的,相关联字段主键所在的是主...
  • (本次实验难点是完整性约束,特别是参照完整性约束(主外键)!应注意对完整性约束作验证,关键给出违反约束的验证,要说明理由)
  • 【MySQL数据库外键和数据完整性

    千次阅读 2019-07-02 19:51:35
    主、外键定义 主键:保证数据的唯一性。 外键:和第二范式有关,保证数据的一致性。传递依赖:A→B→C,则对于同一个B... 参照完整性:定义主键和外键引用的约束条件,即外键引用的主键必须存在,说白点就是参照的...
  • 其实这个话题是老生常谈,很多人在工作确实也不会使用外键。包括在阿里的JAVA规范也有下面这一条: 【强制】不得使用外键与级联,一切外键...首先我们明确一点,外键约束是一种约束,这个约束的存在,会保证...
  • 什么是数据库外键?

    2021-04-10 21:17:42
    外键就是一个表的一个字段引用了另一个表的主键,引用的表叫做子表,被引用的表叫做主表,外键是一种约束,描述的是表之间的关系。
  • 什么数据库不建议用外键约束

    千次阅读 2020-07-29 19:31:20
    什么数据库不建议用外键约束 其实这个话题是老生常谈,很多人在工作确实也不会使用外键。包括在阿里的JAVA规范也有下面这一条: 【强制】不得使用外键与级联,一切外键概念必须在应用层解决。 但是呢,询问...
  • 以将京东fuliuqingfeng的用户信息及其多个邮寄商品地址保存到数据库中为例 create table user_info( id char(36) primary key, user_name varchar(30) not null, password varchar(30) not ...
  • SQL Server 2012 外键约束(定义外键、删除外键)

    万次阅读 多人点赞 2019-04-21 20:00:26
    文章目录准备知识定义外键使用SSMS工具定义外键使用SQL方式定义外键删除外键使用SSMS工具删除外键方式一:在对象资源管理器删除主键方式二:在设计器删除主键使用SQL方式删除外键 准备知识     外键...
  • 常见约束类型SQL约束有列级和级之分,列级约束作用于单一的列,而级约束作用于整张数据,常见的约束类型: ...外键约束:唯一标识其他表中的一条行/记录; CHECK约束:保证列的所有值满足某一条件; 索
  • 数据库表外键

    千次阅读 2017-02-17 19:11:00
    一.什么是外键 某张表的列在另外一张表中存储,而且是另一张的主键列,就可以说该列为外键列,外键列可以有一列或多列,但是外键列必须有主键约束或者唯一约束
  • MySQL外键约束删除时和更新时各取值的含义,创建2个,分别为studnet 学生和monitor 班长: 学生有学号和姓名2个属性; 班长有班级和学号2个属性。 班长设置外键学号,连接主学生的学号属性。 并...
  • 约束,是对表的数据进行限定,保证数据的正确性、有效性和完整性,约束分为以下几类: 主键约束:primary key 非空约束:not null 唯一约束:unique 外键约束:foreign key 1.1 非空约束:not null 1)在创建...
  • 关系型数据库外键约束与关联

    千次阅读 热门讨论 2020-10-07 18:22:57
    外键用于支持关系型数据库的 “参照完整性”,外键具有保持数据完整性和一致性的机制,对业务处理有着很好的校验作用。 举例说明:假设 Table user 的 Column user.id 为主键(Primary key),Table profile 的 ...
  • 数据库的五种约束 1.primary key 约束:设置主键约束 ...创建、创建主键约束、唯一约束、外键约束、check约束、默认约束 create table employees ( empid int not null, firstname nvarchar(50) not null, l

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,764
精华内容 19,505
关键字:

数据库中表的外键约束是什么完整性