当前位置: 首页 > news >正文

主键、外键和约束:让数据库“有规矩”才能不出错!|转行学DB第5天

为什么你的表里会混进“奇怪的数据”?三分钟搞懂数据库的“家规”

大家好呀!我是数据库小学妹👋一个正在从设计转行学数据库的"萌新"。

前几篇我们学会了建表、插数据、查数据。但有个问题一直让我头疼:

我怎么保证同一张表里不会出现两条一模一样的学生记录
怎么保证订单表里的用户ID,在用户表里一定存在
怎么防止有人把年龄填成负数

这些问题,靠“自觉”是不行的。数据库给了我们一套“家规”——也就是约束,专门用来管数据的“规矩”,保证数据的​准确性、一致性和完整性​!

今天我就把自己学到的主键、外键、各种约束整理出来,保证你看完就能用上。


一、为什么数据库需要“规矩”

没有红绿灯和斑马线,马路上会乱成什么样?数据也一样。

约束就是数据库给表里的数据定下的规则,违反规则的操作会被直接拒绝。

新手阶段,主键和外键是最常用也最重要的,我重点讲。


二、主键:每条数据的“身份证”

主键就是表中每一行数据的唯一标识。就像每个人都有身份证号,不会重复。

建表时设置主键

CREATETABLEstudents(idINTPRIMARYKEY,-- 这列就是主键nameVARCHAR(50));

主键的规矩

  • 不能重复:插两条id=1的数据会报错
  • 不能为空:不写id也会报错
  • 一张表只能有一个主键(但可以由多列组成,叫联合主键)

💡 小技巧:很多表会用id作为主键,然后设置AUTO_INCREMENT(自动递增),这样插入时不用自己写数字,数据库自动给。

CREATETABLEstudents(idINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(50));

我踩过的坑

第一次建表忘了设主键,结果插入了两条一模一样的学生记录。后面想删除一条,发现没法区分它们……后来才知道,每张表都应该有一个主键


三、外键:两张表之间的“锁链”

外键是用来连接两张表的。比如:

  • 学生表(主表):存放学生基本信息
  • 成绩表(从表):每个学生有多条成绩记录

成绩表里需要记录“这个成绩属于哪个学生”,于是存学生表的id。这个student_id就是外键——它指向学生表的主键。

建表时设置外键

-- 学生表(主表)CREATETABLEstudents(idINTPRIMARYKEY,nameVARCHAR(50));-- 成绩表(从表)CREATETABLEscores(idINTPRIMARYKEY,student_idINT,scoreINT,FOREIGNKEY(student_id)REFERENCESstudents(id));

外键的规矩

  • 插入成绩时student_id必须在学生表里存在,否则报错
  • 删除学生时:如果该学生还有成绩记录,默认会报错(需要先删成绩或设置级联删除)

💡 外键就像“家长签字”——你得先有家长,孩子才能被承认。

新手要不要用外键?

我查了很多资料,有的说“一定要用”,有的说“业务层控制就行”。我的结论是:

  • 学习阶段:建议了解概念,可以先不强制使用(很多在线练习环境不支持外键)
  • 实际工作中:金融、电商等核心系统会用,保证数据不出错

四、常见约束:数据库的"质检员"

唯一约束(UNIQUE)

字段值在表中​必须唯一​,但可以为空。

CREATETABLEusers(idINTPRIMARYKEY,phoneVARCHAR(20)UNIQUE-- 手机号不能重复);

非空约束(NOT NULL)

字段​必须有值​,不能为空。

CREATETABLEstudents(idINTPRIMARYKEY,nameVARCHAR(50)NOTNULL-- 姓名必须有);

默认值(DEFAULT)

插入数据时如果不指定值,自动使用默认值。

CREATETABLEstudents(idINTPRIMARYKEY,statusVARCHAR(10)DEFAULT'新生'-- 不填时默认“新生”);

检查约束(CHECK)

限制字段的取值范围(MySQL 8.0+支持)。

CREATETABLEstudents(idINTPRIMARYKEY,ageINTCHECK(age>=0ANDage<=150));

五、新手避坑指南

常见错误正确做法
忘了设主键每张表都设一个id主键
主键用了业务字段(如手机号)手机号可能会变,用无意义的id做主键
插入外键时父表没有对应数据先插入父表,再插入子表
删除父表数据时忘记子表先删子表(成绩),再删父表(学生)
字符串写错导致外键匹配失败外键通常用数字id关联,少用字符串

六、今日学习心得

今天的内容总结成三句话:

  1. 主键= 身份证,保证每一行独一无二
  2. 外键= 挂钩,保证两张表的数据能对得上
  3. 约束= 规矩,让数据从一开始就干净

有了这些“家规”,数据库就不会收留“奇怪的数据”了。虽然刚开始写建表语句时要多敲几行代码,但后面查数据、做分析时会省心一万倍。


👋 我是数据库小学妹,一个每天都在和SQL语句"较劲"的数据库小白。我们一起把看似复杂的技术,变得简单有趣!💪


本文为个人学习总结,所有命令均在MySQL 8.0环境下验证。约束能帮你少踩很多坑,建议从今天起建表都加上主键。

http://www.jsqmd.com/news/616342/

相关文章:

  • 2026心理测试公司怎么选:成都情绪价值心理疏导/成都焦虑症心理咨询/成都离婚心理疏导/成都空心病心理咨询/选择指南 - 优质品牌商家
  • 多门店运维值班交接实战:交的不是工单状态,应该是排障上下文
  • 2026年4月水果礼盒门店口碑推荐,海棠果礼盒/小苹果礼盒/水果礼盒/鸡心果礼盒/香妃果礼盒,水果礼盒供应商推荐 - 品牌推荐师
  • 2026年比较好的钢结构/钢结构施工口碑好的厂家推荐 - 行业平台推荐
  • string的特性及使用
  • 2026年知名的吉林焊接钢板粮仓/吉林圆形钢板粮仓实力工厂推荐 - 行业平台推荐
  • OpenClaw免费模型推荐与配置指南!
  • 2026年评价高的微孔滤膜/聚四氟滤膜/混合纤维素酯滤膜厂家选择推荐 - 行业平台推荐
  • 2026年4月匣钵报价排行:氧化铝匣钵、耐高温匣钵、刚玉匣钵、刚玉莫来石匣钵、堇青石匣钵、莫来石匣钵、匣钵选择指南 - 优质品牌商家
  • Idiap研究院:让语音识别AI学会聆听对话历史,压缩音频记忆
  • 2026年口碑好的脱碳过滤器/海宁正压过滤器/聚丙烯过滤器/海宁板框过滤器优质公司推荐 - 行业平台推荐
  • 值类型与引用类型:别再只背“栈和堆”了,看这 个实际影响吨
  • 【国家卫健委《医疗卫生机构数据安全管理指南》强制落地倒计时】:PHP脱敏工具未升级?3类高危场景已触发监管预警!
  • OpenClaw备份策略:gemma-3-12b-it自动化数据保护方案
  • 2026年热门的辽宁钢结构/辽宁钢结构施工多家厂家对比分析 - 行业平台推荐
  • 解锁复杂系统模拟:Mesa框架全维度实战指南
  • 3.一文看懂反向传播:从单个神经元到 PyTorch 自动求导
  • 像个小丑,我花了一周把 APP 做上线,又花两小时改回本地
  • 2026ukey集中管理技术解析:u盾集中管理/网银密钥集中/网银盾安全集中/网银盾集中/ukey安全/选择指南 - 优质品牌商家
  • 加入csdn 5周年
  • C# OnnxRuntime 部署 RMBG-2.0 实现高精度背景去除
  • 2026年热门的层叠式过滤器/过滤器/海宁层叠式过滤器厂家推荐与选型指南 - 行业平台推荐
  • 动态规划——01背包问题、完全背包(python、一维DP)
  • vue数据更新了,但视图不刷新的诡异问题 this.$set
  • 当Windows 10的OneDrive无法彻底卸载时,这个批处理脚本是你的终极解决方案
  • 2026年全网视频去水印实测:6款消除字幕工具上手,哪款更适合你
  • OpenClaw个人知识库:Qwen3-4B驱动文档智能检索
  • 深圳游戏主板品牌怎么选:2026年华硕、七彩虹、技嘉、微星产品线全解析
  • Arduino RTCtime库:标准time.h兼容的DS1307/DS3231驱动
  • 鸿蒙_ArkUI组件同时支持双击和单击事件