目录
[1. NOT NULL 非空约束](#1. NOT NULL 非空约束)
[2. DEFAULT 默认值](#2. DEFAULT 默认值)
[3. UNIQUE 唯一约束](#3. UNIQUE 唯一约束)
[4. PRIMARY KEY 主键约束(重点!)](#4. PRIMARY KEY 主键约束(重点!))
[5. 主键自增(AUTO_INCREMENT)](#5. 主键自增(AUTO_INCREMENT))
[设计数据表时,一般都会给表设定一个主键列,主键列通常就是一个整数的 id。手动指定 id 的值,可能就会遇到重复的情况。](#设计数据表时,一般都会给表设定一个主键列,主键列通常就是一个整数的 id。手动指定 id 的值,可能就会遇到重复的情况。)
作为一名正在学习数据库的学生,今天把课上关于数据库约束的核心内容整理成笔记啦!这篇博客会按照老师讲的知识点,结合代码示例,一步步带你理解各种约束的作用和用法。
一、引出数据库约束:核心理念
老师在课上强调了一个很深刻的理念:++人是不靠谱的!!!++
机器靠谱,计算机靠谱,程序靠谱~~
所以,我们希望数据库程序能够按照咱们指定的要求,对数据进行一定程度的校验。如果发现某个数据不符合预期,直接报错~~
这让我想到了Java中的++多态 和**@Override注解**++ :子类重写方法的时候,需要在方法上加@Override注解。不加这个注解,代码也能正确编译执行;但加上了,编译器会做校验。这和数据库约束的思想很像------++用规则提前拦截错误,而不是依赖人去保证正确。++
二、数据库约束讲解
1. NOT NULL 非空约束
null表示空,相当于表格的这个单元格是空着的++。非空约束就是要求这个列必须有值,不能留空。++
创建表时使用约束:
drop table student;
create table student(id int not null, name varchar(20) not null);
desc student;
插入空值测试:
insert into student values(null, null);
-- 结果:插入空值会报错!
select * from student;
💡 注意:
NOT NULL约束确保列不能存储NULL值。如果尝试插入NULL,数据库会直接报错。
2. DEFAULT 默认值
给列指定默认值,当没有给该列赋值时,使用默认值。++没被指定的列,也就是剩下的列会被指定为默认值。++
示例:
create table student(id int, name varchar(20) default '匿名');
insert into student (id) values(1);
select * from student;
💡 注意:
DEFAULT约束指定列插入时的默认值。如果插入时不指定该列,数据库会自动填充默认值。
3. UNIQUE 唯一约束
unique唯一约束,值不能重复~~
每次插入/修改数据的时候,都会先进行查询(数据库自动进行的),判定要插入/修改的数据,是否已经存在,如果存在了就会失败~~
对比:
✅ unique
是存的数据就不能重复(重复的数据存不下去),查询的结果自然也是不重复的~~
✅distinct
本来数据库服务器存储的内容中,可能已经有重复的了,展示给用户的时候,展示的是去重的结果
✅ 身份证号、手机号码、护照号码......这些字段通常都需要加UNIQUE约束。
示例:
create table student(id int unique, name varchar(20));
insert into student values(1, '张三');
-- 尝试插入重复的 id
update student set id = 1 where name = '张三';
-- 结果:会报错(Duplicate entry '1' for key 'student.id')
💡 注意:
UNIQUE约束确保列中的所有值都是不同的。如果尝试插入重复值,数据库会拒绝。
4. PRIMARY KEY 主键约束(重点!)
主键约束是++数据库里最重要的约束!++
它描述表中的某个列/某几个列作为"主键",主键就能起到这个数据行"身份标识"的效果。
++主键的两个核心特性:++
-
++不能重复++
-
++不能为空++
📌 相当于
unique + not null的结合体!
示例:
create table student(id int primary key, name varchar(20));
desc student;
-- 尝试插入 null
insert into student values(null, '张三');
-- 结果:报错(Column 'id' cannot be null)
-- 尝试插入重复值
insert into student values(1, '李四');
insert into student values(1, '王五');
-- 结果:报错(Duplicate entry '1' for key 'student.PRIMARY')
5. 主键自增(AUTO_INCREMENT)
数据库提供了++自增主键++功能,主键的值不需要手动分配,自动分配~~
++设计数据表时,一般都会给表设定一个主键列,主键列通常就是一个整数的 id。手动指定 id 的值,可能就会遇到重复的情况。++
示例:
create table student(id int primary key auto_increment, name varchar(20));
insert into student values(null, '张三');
select * from student;
💡 注意:这里插入
null,++不是插入空值,而是提醒数据库进行自增主键的操作!++
手动插入主键也可以:
insert into student values(100, '张三');
select * from student;
💡 注意:既自动分配 + 手动分配后,再次手动分配则 id 会接着手动分配的。比如你手动插了 100,下一次自动分配会从 101 开始;再手动插 100,数据库不会报错(因为主键冲突),但通常会报错(因为自增机制会记录最大值,下次自动分配从 101 开始)。
自增主键的分配规则:
自增主键分配的值,是拿着++最大值,再 +1++的方式来分配的~~
三、小结
通过今天的学习,我理解了数据库约束的核心思想:++用规则和程序来保证数据质量,而不是依赖人。++
主要约束类型:
| 约束类型 | 作用 |
|---|---|
NOT NULL |
列不能为空 |
DEFAULT |
列有默认值 |
UNIQUE |
列值不能重复 |
PRIMARY KEY |
列值唯一且非空(身份标识) |
AUTO_INCREMENT |
主键自动增长,避免手动管理 |
++PS:更多有关约束的内容我将在下一篇博客中详细讲述!!!欢迎关注++
📌 温馨提示:所有代码示例均在Navicat环境中测试过