SQL 字段约束笔记

一、约束介绍

约束作用:在建表时给字段添加规则,限制表中数据 ,保证数据的完整性、合法性。

MySQL 常用约束:

  • not null:非空约束
  • unique:唯一约束
  • primary key:主键约束
  • auto_increment:主键自增
  • 联合主键(多个字段共同作为主键)
  • foreign key:外键约束

二、非空约束 not null

规则:被修饰的字段不能为 null,插入数据时必须提供值。

sql 复制代码
create table user(
    id int,
    name varchar(20) not null
);

说明:插入数据时 name 不能不赋值,不能写入 null。

三、唯一约束 unique

规则:当前字段所有数据不能重复,允许存在一个 null。

sql 复制代码
create table user(
    id int,
    phone varchar(11) unique
);

注意区分:unique 允许 null;主键不允许 null。

四、主键约束 primary key

主键 = 唯一约束 + 非空约束

特点:

  1. 字段不能重复,不能为 null
  2. 一张表只能有一个主键
sql 复制代码
-- 单列主键写法
create table user(
    id int primary key,
    name varchar(20)
);

主键自增 auto_increment

搭配整数主键使用,新增数据时自动生成递增数字,无需手动赋值。

sql 复制代码
create table user(
    id int primary key auto_increment,
    name varchar(20)
);

五、联合主键

概念:多个字段组合在一起共同充当主键

规则:多个字段组合整体不能重复,单独字段可以重复。

一张表依旧只能设置一组主键。

sql 复制代码
create table student_course(
    student_id int,
    course_id int,
    primary key (student_id, course_id)
);

示例理解:学生id + 课程id联合主键;同一个学生可以选多门课,同一课程可以被多个学生选,但【学生+课程】组合不能重复。

六、外键约束 foreign key

作用:维护多张表之间关联关系,保证引用数据合法。

  • 子表(从表):设置外键的表
  • 父表(主表):被引用的表,被引用列必须为主键
sql 复制代码
-- 主表
create table dept(
    dept_id int primary key,
    dept_name varchar(20)
);

-- 从表,建立外键关联
create table emp(
    emp_id int primary key auto_increment,
    emp_name varchar(20),
    d_id int,
    foreign key (d_id) references dept(dept_id)
);

⚠️ 开发重要提示:

互联网项目极少使用外键约束。外键会降低插入、删除性能,线上项目一般在业务代码层面控制关联逻辑。

七、约束对比小结

约束 关键字 是否允许null 是否允许重复
非空约束 not null ❌ 不允许 ✅ 允许重复
唯一约束 unique ✅ 允许1个null ❌ 不可重复
主键约束 primary key ❌ 不允许 ❌ 不可重复
相关推荐
软件技术NINI1 小时前
盗墓笔记html+css+js 2页
css·笔记·html
qizayaoshuap1 小时前
鸿蒙 ArkTS 实战:搜索列表 城市实时过滤(示例 94)
android·华为·harmonyos
朝星2 小时前
Framework筑基之Handler消息机制5(应用层)
android
智者知已应修善业2 小时前
【用D触发器组成000-001-010-011-100】2025-6-7
驱动开发·经验分享·笔记·硬件架构·硬件工程
2601_965798472 小时前
ForumLab Review: Fast PHP Script for SEO Forum Sites
android·adb·php
纪念 2292 小时前
数据库基础
数据库·笔记·学习方法
AnsonNie2 小时前
处理提示“wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。”【笔记】
笔记
山城码农笑松哥2 小时前
Redis 8.8 新特性实操笔记:原生数组、INCREX 限流、XNACK 流处理
redis·笔记·junit
LUCKY-LIVING2 小时前
ELF File in linux
android·java·linux