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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 本文用通俗易懂的语言讲解了主键(数据的唯一标识)、外键(表间关联)以及唯一约束、非空约束等其他常见约束规则。通过具体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环境下验证。约束能帮你少踩很多坑,建议从今天起建表都加上主键。

相关文章
|
7天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34462 17
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
19天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
45287 142
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
8天前
|
人工智能 JSON 监控
Claude Code 源码泄露:一份价值亿元的 AI 工程公开课
我以为顶级 AI 产品的护城河是模型。读完这 51.2 万行泄露的源码,我发现自己错了。
4840 20
|
1天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
1749 5
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
7天前
|
人工智能 API 开发者
阿里云百炼 Coding Plan 售罄、Lite 停售、Pro 抢不到?最新解决方案
阿里云百炼Coding Plan Lite已停售,Pro版每日9:30限量抢购难度大。本文解析原因,并提供两大方案:①掌握技巧抢购Pro版;②直接使用百炼平台按量付费——新用户赠100万Tokens,支持Qwen3.5-Max等满血模型,灵活低成本。
1741 5
阿里云百炼 Coding Plan 售罄、Lite 停售、Pro 抢不到?最新解决方案

热门文章

最新文章