mysql中的外键的定义 外键约束概念解析

mysql如何理解主键和外键

嘿,让我给你讲一个我在数据库工作时的故事。
主键和外键是两项基本技能。

2 004 年我在上海第一次接触MySQL时,老板让我建立一个用户系统。
我想了一下,但用户列表难道不允许用户选择任何名称用作唯一标识符吗?重名很容易啊!因此,我将 user_id 列直接添加到 users 表中,自动递增,并将其设置为主键。
当时我傻乎乎地以为主键赋予了每条记录一个唯一的“身份证号”,不能为空,也不能重复。
后来发现复合主键很常见。
例如,在订单表中,使用(order_id,product_id)作为复合主键也很常见,这意味着“该用户购买了该产品”。
这两者加在一起是独一无二的。

我后来在创建订单表时才了解到外键。
订单表有一个 user_id 列。
直接将其设置为外键,引用用户表中的主键 user_id。
刚接手项目的时候,有同事创建了一个订单表,直接用随机数作为user_id。
结果users表中不存在这个人,数据也不匹配。
我无能为力,最后向学长请教。
外键确保数据关联。
用户中必须存在订单的 user_id。
如果不存在,您的数据将会混乱。
这就是参照完整性,可以防止“孤立”订单的发生。

杭州在创建部门员工表时也使用了外键。
部门表没什么特别可说的。
dept_id 是主键。
员工表有一个外键dept_id,它指向部门表中的dept_id。
这确保了所有员工都属于现有部门。
此时,你有一个选择。
如果我删除一个部门,后面的员工怎么办?有些公司删除了所有员工,有些部门即使没有员工也继续存在。
这是一个外键 ON DELETE CASCADE 和 SET NULL 设置,您应该根据您的业务需求来决定。

所以主键是“我是谁?”外键是“我属于谁?”我在深圳带团队的时候,新人总是对这两者感到困惑,而且外键总是设置不正确,导致数据插入错误。
以用户和订单为例,我们将解释订单的 user_id 如何告诉您它属于哪个用户。
该 ID 必须在用户表中找到。
如果没有找到,就无法工作。
它是如此简单,以至于我一遍又一遍地重复。

什么是最重要的?这就是一个限制!主键、外键这样的约束能省多少力气?当时,我有一个实习生,他轻轻一挥手就删除了主键。
所有相关的外键表都已爆炸,数据不再匹配。
我感到非常着急。
所以这次我想告诉所有初学者在操作主键和外键之前要仔细考虑一下主键和外键的用途,避免不必要的删除或更改。

换句话说,主键和外键是数据库“规则”,可确保您的数据不会混淆或变得不相关。
想一想。
如果没有这两个,数据会是什么样的混乱?所以,在这个业务中我们必须遵循这两个约束。