数据库中主外键概念详细介绍

关于数据库的主外键设置问题

一、主外键概念

主键

1、主键

​ 简单而言,能够唯一的表示表中的每一行数据,这样的列属性称为表的主键,使用表主键可以保证实体的完整性,可对表内数据进行修改、删除时使用主键来操作,同时也主要用于和其他表之间通过主外键关联建立表之间的联系。例如:

​ 下图这个员工表中对应第一行红色字段为表的主键,它标识出了数据的唯一性

在这里插入图片描述

2、主键作用

​ 保证数据库表的唯一性、完整性

​ 用于和其他表之间建立外键关联的关系,从而实现对关联表的控制操作

3、主键设计原则

​ 主键的设计对用户无意义(由下边举例阐述)

​ 以“居民身份证” 作为作为主键的设置,在升号时带来的麻烦作为反例。但实际上身份证作为主键设计是没有问题的。用身份证作为主键,对其他数 据的引用带来了好处,数据完整性得到保证。升号属于几十年才可能有的事情(也许接下来几十年都不会再升号),这属于极少变化的属性。虽然升级时带来了麻 烦,可是否不用身份证作为主键的升级就不麻烦了吗?其实无论选择什么属性作为主键,升级的工作量都是相当的。

​ 主键设置应该是单列的,为了提高查询和连接的效率

​ 主键永远不要去更新它

​ 主键不应该包括动态变化的数据,例,时间戳、时间列等

​ 主键通常要设置自增长,由计算机自动来生成

4、主键选取策略

​ 通常数据库建表时一个表至多能设置一个主键,以下为常用三种主键选取方式:

  1. ​ 自动增长型字段

  2. ​ 手动增长型字段

  3. ​ UniqueIdentifier

    ​ 使用UniqueIdentifier SQL Server提供一个UniqueIdentifier数据类型(16字节),并提供一个生成函数NEWID(),生成一个唯一的UniqueIdentifier

  4. ​ COMB类型

    保留UniqueIdentifier的前10字节,后6字节表示生成时间

外键

1、外键

​ 外键就是通过表中一个键将两个表连接起来的键

在这里插入图片描述

2、外键作用

​ 保证数据的完整性和一致性

​ 主要目的是控制存储在外键表中的数据。

​ 支持关联查询。

​ FOREIGN KEY约束用于防止会破坏表之间链接的操作

3、阻止执行

​ 从表插入一条数据时,若外键值不是主表的主键值时,将阻止插入数据

在这里插入图片描述

mysql> INSERT INTO banji VALUES('11','英语一班','8');		-- 错误写法
ERROR 1062 (23000): Duplicate entry '16' for key 'PRIMARY'

mysql> INSERT INTO banji VALUES('11','英语一班','9');		-- 正确写法
Query OK, 1 row affected (0.00 sec)

​ 从表修改外键值时,其值不是主表的主键值则阻止修改(可参照上图理解)

​ 主表删除某一行时,其主键值在从表里存在则将阻止删除(若想删除,必须要现删除从表的关联行)

​ 主表修改主键值时,旧值在从表里存在,则将阻止修改(若想修改,必须要现删除从表的关联)。

4、级联执行

​ 主表删除、修改某一行数据,则从表数据将被一起删除、修改

总结

​ 结合实际情况来看,数据库设计时尽量不要设计太多外键关系;因为在后期的数据库维护起来比较麻烦,出现各种关联关系的表,耦合度比较高,因而个人不建议,设置太多外键关联。(可通过子代码编写方法,实现数据之间的逻辑业务处理)

猜你喜欢

转载自blog.csdn.net/weixin_45496190/article/details/106178416