讲清楚MySQL主键和外键

server/2024/9/22 17:44:09/

1.7. 主键和外键

1.7.1. 主键

主键就是能唯一标识表中每条记录的字段,不能有null值,主键可以包含一个字段或者多个字段,

主键要短,可唯一标识记录,且永不改变。一般类型设为 INT(最大可表示2亿,一般足够了,要根据具体的需求决定),设为主键后自动变为不可为空,另外还要设定 AI(Auto Incremental)自动递增,这样会方便许多,不需要担心主键唯一性的问题。

如何产生主键值:

在业务中一般不会用业务字段作为主键,要使用单独的字段作为主键,主要为了保密业务数据,也方便业务字段的修改,生成唯一主键值可采用以下几种方法:

  1. 主键字段设置为自增
  2. 使用UUID()函数,会产生一个长度为36个字符的字符串且永不重复,适合在集群环境下,一个表被分在多个服务器上也不会有重复主键。
  3. 使用 UUID_SHORT() 函数,产生一个64位的无符号整数且全局唯一。

主键和唯一索引:

主键和唯一索引都要求值是唯一的,但它们之间存在一些不同:

  • 一个表中只能定义一个主键,但是能定义多个唯一索引。
  • 主键中的值不能为 NULL,而索引中的值可以为 NULL。

1.7.2. 外键

什么是外键:

外键用来引用其他表,通过子表的一个或多个字段对应父表的主键或唯一键值,将子表和父表建立关联关系。

外键约束

外键约束能够保证数据的完整和正确。例如,一个国家已经有了城市,就不能轻易的从 country 表删除国家,否则就会造成这个城市数据的不完整。也不能为一个城市设定一个不存在的 country_id,否则这个城市数据就是错误的。

查看一下 city 表定义的外键约束:

sql">SHOW CREATE TABLE city\G
sql">*************************** 1. row ***************************Table: city
Create Table: CREATE TABLE `city` (`city_id` smallint unsigned NOT NULL AUTO_INCREMENT,`city` varchar(50) NOT NULL,`country_id` smallint unsigned NOT NULL,`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`city_id`),KEY `idx_fk_country_id` (`country_id`),CONSTRAINT `fk_city_country` FOREIGN KEY (`country_id`)REFERENCES `country` (`country_id`)ON DELETE RESTRICTON UPDATE CASCADE) ENGINE=InnoDB AUTO_INCREMENT=601 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

注意其中的部分:

sql">CONSTRAINT `fk_city_country` FOREIGN KEY (`country_id`)REFERENCES `country` (`country_id`)ON DELETE RESTRICTON UPDATE CASCADE

这里定义了一个外键:

  • 位于 CONSTRAINT 关键字之后的 fk_city_country 是外键的名字。它是可选的。
  • 位于 FOREIGN KEY 关键字之后的是作为外键的字段名。
  • 位于 REFERENCES 关键字之后的是被引用的表和字段。
  • ON DELETE 和 ON UPDATE 指定了删除或更新父表中的数据时要采取的约束策略。可以使用以下 3 个策略中的一个:
    • CASCADE:如果被引用的表中的一行被删除或更新,该表中匹配行的值会自动删除或更新
    • SET NULL:如果被引用的表中的一行被删除或更新,该表中匹配行的值设置为 NULL。
    • RESTRICT: 如果被引用的表中的一行在该表中有匹配的行,试图删除或更新被引用的表中行时会引发 MySQL 错误。这是默认的策略。

通常,外键所属的表被称作子表,被外键引用的表被称作父表。


http://www.ppmy.cn/server/23591.html

相关文章

UniAD:以规划为导向的端到端自动驾驶

文章链接 这个文章是CVPR2023 Best Paper https://arxiv.org/pdf/2212.10156 提出背景 以往的自动驾驶多数是为不同的任务场景设计部署单独的模型,这样子组成的系统会很复杂如图a。 图b这是多任务共享一个主干,但还是要分离训练,而且不是…

实验一: 设备密码配置与远程管理

1.实验环境 用路由器和交换机搭建实验环境 2.需求描述 实现管理员主机对交换机和路由器的远程管理 设备上配置的密码都要被加密 3.推荐步骤 对路由器配置的步骤如下: 实现路由器和PC的连通性配置VTY密码和特权模式密码在PC上Telnet 到路由器。 对交换机配置的…

WPF-关于动画Animation(及其常见问题)

目录 一、动画合集 常见动画类型 1、资源里添加动画资源 2、事件触发器里开始一个动画 3、Double型关键帧动画 4、Object型关键帧动画 5、Color型关键帧动画 6、String型关键帧动画 7、Matrix型沿路径动画 二、扩展 Ⅰ 动画常见问题 1、控制动画结束问题 Ⅱ 流动…

【算法】前缀和

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、一维前缀和二、二维前缀和三、寻找数值的中心下标四、除自身以外数组的乘积五、和为k的子数组六、和…

怎么理解JavaScript原型、原型链

原型 JavaScript被描述为一种基于原型的语言,也就是每一个对象都拥有一个原型对象。 当我们访问一个对象的属性时,它不仅仅该改对象上查找,还会到这个对象的原型上查找,甚至是到这个对象的原型的原型上查找,这样一层…

力扣-有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 注…

双向链表专题

文章目录 目录1. 双向链表的结构2. 双向链表的实现3. 顺序表和双向链表的优缺点分析 目录 双向链表的结构双向链表的实现顺序表和双向链表的优缺点分析 1. 双向链表的结构 注意: 这⾥的“带头”跟前面我们说的“头节点”是两个概念,带头链表里的头节点…

Ansible 自动化运维

一、介绍 1、定义: ansible是自动化运维工具,基于Python开发,具有批量系统配置、批量程序部署、批量运行命令等功能。 ansible是基于 paramiko(框架) 开发的,并且基于模块化工作,本身没有批量…