主键确保每行数据唯一且可精准定位,外键强制表间关联有效性并防止孤儿记录;无主键导致查询低效、更新误伤,无外键引发数据不一致与业务失控。

数据库需要主键和外键,是为了让数据不乱套、不丢人、不认错人——比如你删掉一个用户,订单不会变成“孤儿”;你查张三的订单,系统能立刻锁定是他本人下的,而不是把同名李四的记录混进来。
主键:给每一行贴上不可复制的身份证
第一步:打开一张表,比如「学生表」,里面存着姓名、年龄、班级。如果没有主键,张三可能有三条一模一样的记录,你根本分不清哪条是刚录入的、哪条是去年的、哪条是导错的。
第二步:给这张表加一个叫「学号」的字段,并设为主键。数据库立刻强制:这个字段不能空、不能重复、删了就不能补——就像身份证号,全国唯一,丢了得重办,不能自己编一个。
第三步:当你执行UPDATE 学生 SET 年龄 = 20 WHERE 学号 = '2023001',数据库靠学号精准定位到那一行。如果靠姓名,而班里有两个张三,它就只能猜,或者全改——【没主键的UPDATE或DELETE极大概率误伤】。
外键:让两张表之间“认亲”,不许乱攀关系
方法一:用订单表关联用户表
在「订单表」里加一列user_id,再把它设为外键,指向「用户表」的id主键。这样,每插入一条订单,数据库会当场检查:user_id = 999在用户表里有没有?没有就直接报错,拒绝入库。
方法二:删用户时自动处理关联数据
建外键时加上ON DELETE CASCADE,意思是“用户删了,他所有订单也跟着清掉”。如果不加,又没手动删订单,那数据库里就会留下一堆user_id = 999的订单——这些订单找不到主人,就是“孤儿记录”,报表一汇总,数字就对不上。
不设主键和外键,实际会怎样?
新建一个无主键的「日志表」,每天插入10万条操作记录。三个月后想查“张三最后一次登录时间”,数据库只能从头扫到尾——没索引、没锚点,查十分钟起步。
再建一个没外键的「退款表」,随便填个order_id = 9999999。财务导出退款清单时发现:这单对应的订单根本不存在,但钱已经退了——【外键缺失时,业务逻辑再严密,数据库也不拦你犯错】。


















