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

本文涉及的产品
云数据库 PolarDB MySQL 版,列存表分析加速 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
PolarDB Agent Express,2核4GB
简介: 本文用通俗易懂的语言讲解了主键(数据的唯一标识)、外键(表间关联)以及唯一约束、非空约束等其他常见约束规则。通过具体SQL示例展示了各种约束的使用方法,并分享了新手容易踩的坑和实用建议。

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

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

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

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

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

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

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


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

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

约束就是数据库给表里的数据定下的规则,违反规则的操作会被直接拒绝。
图片排版设计 (4).png

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


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

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

建表时设置主键

CREATE TABLE students (
    id INT PRIMARY KEY,   -- 这列就是主键
    name VARCHAR(50)
);

主键的规矩

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

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

CREATE TABLE students (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50)
);

我踩过的坑

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


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

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

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

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

建表时设置外键

-- 学生表(主表)
CREATE TABLE students (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

-- 成绩表(从表)
CREATE TABLE scores (
    id INT PRIMARY KEY,
    student_id INT,
    score INT,
    FOREIGN KEY (student_id) REFERENCES students(id)
);

外键的规矩

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

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

新手要不要用外键?

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

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

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

唯一约束(UNIQUE)

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

CREATE TABLE users (
    id INT PRIMARY KEY,
    phone VARCHAR(20) UNIQUE   -- 手机号不能重复
);

非空约束(NOT NULL)

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

CREATE TABLE students (
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL   -- 姓名必须有
);

默认值(DEFAULT)

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

CREATE TABLE students (
    id INT PRIMARY KEY,
    status VARCHAR(10) DEFAULT '新生'   -- 不填时默认“新生”
);

检查约束(CHECK)

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

CREATE TABLE students (
    id INT PRIMARY KEY,
    age INT CHECK (age >= 0 AND age <= 150)
);

五、新手避坑指南

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

六、今日学习心得

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

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

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


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


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

相关文章
|
1月前
|
SQL 数据库
多表关联查询入门:LEFT JOIN、INNER JOIN一文搞懂|转行学DB第6天
本文通俗易懂地讲解了数据库多表查询的三种JOIN操作:INNER JOIN(内连接)只返回两表匹配的数据,适用于查询交集数据;LEFT JOIN(左连接)保留左表所有记录并匹配右表数据,适用于查询主表完整信息;RIGHT JOIN(右连接)则保留右表所有记录。
|
2月前
|
SQL 移动开发 关系型数据库
MySQL技巧:利用窗口函数高效去重,告别嵌套子查询
MySQL技巧:利用窗口函数高效去重,告别嵌套子查询
|
13天前
|
SQL JSON 关系型数据库
慢SQL排查三板斧:SHOW PROCESSLIST + 慢查询日志 + EXPLAIN 实战
教你三招快速定位CPU 100%元凶:SHOW PROCESSLIST查活跃查询、开启慢日志+mysqldumpslow分析、EXPLAIN深度诊断SQL性能。干货不啰嗦,专治线上急症!
|
1月前
|
开发框架 Java 数据库连接
一张图讲完Java 30年发展史,看完彻底搞懂版本演进
这篇Java版本演进指南,用一天时间理清30年发展脉络:从JDK 1.0“一次编写,到处运行”,到JDK 8函数式革命(Lambda/Stream),再到JDK 17/21 LTS新标配(var/record/虚拟线程)。帮你告别版本困惑,读懂面试考点,选对生产版本。
一张图讲完Java 30年发展史,看完彻底搞懂版本演进
|
1月前
|
安全 Java 索引
java工具:《对Collections.sort排序后我想制定查询几条,比如list有10条,我只想获取前4条》
java工具:《对Collections.sort排序后我想制定查询几条,比如list有10条,我只想获取前4条》
97 12
|
18天前
|
存储 JSON 缓存
告别数据混乱!数据库设计三范式从入门到实践
数据库小学妹带你轻松入门三范式!用“建房打地基”比喻,讲清1NF(列不可分)、2NF(消除部分依赖)、3NF(消除传递依赖),直击数据冗余、更新异常等痛点。附实战拆表案例与反范式化提醒,助你设计出结构清晰、稳定高效的数据库!
|
2月前
|
小程序 Linux API
零基础保姆级|阿里云+MacOS/Linux/Windows11部署OpenClaw 千问/Coding Plan API配置+微信小程序集成流程
2026年,AI自动化框架与微信生态深度融合,OpenClaw(原Clawdbot)凭借开源、跨平台部署、多模型兼容与插件化扩展能力,成为连接本地/云端算力与微信小程序交互的核心工具。作为一款轻量化AI执行框架,OpenClaw支持阿里云轻量服务器、ECS云服务器部署,也可在MacOS、Linux、Windows11本地环境运行,能无缝集成阿里云千问大模型、免费Coding Plan大模型API,实现自然语言指令解析、任务自动化执行、微信小程序消息收发与交互,满足个人效率管理、轻量业务开发、小程序智能客服等场景需求。
762 4
|
2月前
|
人工智能 Linux API
OpenClaw 阿里云+本地多系统部署全攻略,大模型配置+planning-with-files技能实战解析
在基于OpenClaw(Clawdbot,开发者昵称“龙虾”)进行AI协作的过程中,开发者常面临这样的问题:面对复杂任务时,与AI的多轮对话极易丢失上下文,最终输出结果偏离预期,甚至出现逻辑混乱的情况。2026年,planning-with-files技能的出现彻底解决了这一痛点,该技能通过文件化的规划方式,将复杂任务的执行过程沉淀为标准化文档,让AI协作具备可追溯、可恢复、可管控的特性。本文将完整梳理2026年OpenClaw在阿里云及本地MacOS、Linux、Windows11系统的部署流程,详解阿里云千问大模型与免费Coding Plan API的配置方法,深度解析planning-w
779 3
|
1月前
|
SQL NoSQL 关系型数据库
数据库分类一次讲清|转行学DB第2天
数据库小学妹(UI转行萌新)用通俗语言拆解数据库分类:从关系型(MySQL/Oracle)、NoSQL(Redis/MongoDB/Cassandra)、NewSQL(TiDB)到2026年爆火的向量数据库(Pinecone/Milvus),按数据模型、部署架构、业务负载三大维度梳理,配场景化案例与选学路径,助新手轻松入门。
|
1月前
|
SQL 关系型数据库 MySQL
WHERE、ORDER BY、LIMIT三大神器,让你的查询精准又高效!
本文介绍了SQL查询中的三大核心语句:WHERE(条件过滤)、ORDER BY(排序)和LIMIT(限制结果数)。通过电商订单查询、用户活跃度分析等实际案例,展示了如何组合使用这些语句实现精准查询。文章还分享了常见避坑技巧(如字符串引号使用、NULL值判断)和性能优化建议(如索引使用、分页查询优化)。