MySQL——数据库约束

目录

一:本节⽬标

二:什么是数据库约束

三:约束类型

[四:NOT NULL ⾮空约束](#四:NOT NULL ⾮空约束)

[五: UNIQUE 唯⼀约束](#五: UNIQUE 唯⼀约束)

[六: PRIMARY KEY 主键约束](#六: PRIMARY KEY 主键约束)

[七:FOREIGN KEY 外键约束](#七:FOREIGN KEY 外键约束)

[八:DEFALUT 默认值约束](#八:DEFALUT 默认值约束)


一:本节⽬标

掌握约束的使⽤场景

掌握⾮空约束、默认约束、主键约束、唯⼀约束、外键约束、CHECK的创建

是关系数据库的一个重要功能,主要作用就是保证数据的有效,也可以理解为对数据的正确性进行校验,对数据本身的正确性,关联关系的正确性。
约束一般在指定的列

二:什么是数据库约束

数据库约束是指对数据库表中的数据所施加的规则或条件,⽤于确保数据的准确性和可靠性。这些约束可以是基于数据类型、值范围、唯⼀性、⾮空等规则,以确保数据的正确性和相容。

三:约束类型

unique 唯一约束 不能有重复的(可以为空)

强烈建议对每张表都指定一个主键。

四:NOT NULL ⾮空约束

加了非空约束的列不能为null值
如果可以遇见某个列不可能为空,强烈建议加非空约束,会对查询产生积极的影响。

⽐如创建⼀个学⽣表,学⽣名为NULL时,这条记录是不完整的,在name这列为null是没有意义的

此时需要约束学⽣名的列不能为NULL

如果插入数据name为空就会报错

如果是正常值才可以插入

查看表中元素

查看表结构,NULL列为NO表⽰值不允许为NULL,YES表⽰值可以为NULL

五: UNIQUE 唯⼀约束

指定了唯⼀约束的列,该列的值在所有记录中不能重复,⽐如⼀个⼈的⾝份证号,学⽣的学号等

如果当前列为唯一列,强烈建议加唯一约束,对查询效率也会产生积极影响,

举个例子:

如果我们向列添加一个id相同的学生:

这样既不利于我们查询,也不利于我们排序,那我们就重新创建一个唯一约束

然后我们查看一下表结构:

key 这个列 uni 表示id列加了唯一约束的列。

我们就插入数据看看:

插入第一个数据id为1可以,但是第二次插入id为1基本可以,因为id重复了,在创建表的时候,就把idunique了

插入id不唯一的情况

加了唯一约束,可以写多个null,

六: PRIMARY KEY 主键约束

主键约束唯⼀标识数据库表中的每条记录。

主键必须包含唯⼀的值,且不能包含 NULL 值。(唯一且非空)

每个表只能有⼀个主键,可以由单个列或多个列组成。

通常为每张表都指定⼀个主键,主键列建议使⽤BIGINT类型

sql 复制代码
重构学生表 为id添加主键,name添加非空
drop table if exists student;
create table if not exists student(
id bigint primary key,
name VARCHAR(20) not NULL
);

查看表结构:

1 创建为主键它就是非空

2 id列 的key为PIR就表示当前列为主键

当Id列的重复时会发⽣主键冲突

通常把主键列设置为⾃动增⻓,让数据库维护主键值,

sql 复制代码
drop table if exists student;
create table if not exists student(
id bigint primary key auto_increment,
name VARCHAR(20) not NULL
);

写入数据时,不用人为维护主键

举个例子:我们插入name 不设id:

只关乎业务数据,只需要填写我们所需要的列

这点还有个技巧:

如果我们想插入name但是不知道索引 我们也可以这样写:

查看一下表数据:

自增的值不会减少

插入100 下一次自增到多少呢?

我们再重新插入id=5的数据呢?

但是如果下一次插入主键会在6

还是101?

我们先查看表结构

我们可以看到auto_increment=101(自增到101);所以大家都猜到下一次插入的值是多少了吧

总结一下就是自增后不会自减

自增只能有一个。
如果想一个主键可以包含多个列

就需要单独创建一个主键然后()包含其中。
复合主键:由多个列共同组成的主键,主键是否冲突以多个列的组成进⾏判定

sql 复制代码
drop table student;
 重构学⽣表
create table student (
 id bigint,
 name varchar(20),
 PRIMARY KEY (id, name) # 指定复合主键
);
 插⼊数据
insert into student(id, name) values (1, '张三');
 修改id值插⼊成功
insert into student(id, name) values (2, '张三');
重复插⼊主键冲突,此时主键值由id和name两个列共同决定
insert into student(id, name) values (1, '张三');

运行结果:

最后重复的就会报错,但是第二行就不会,要完全一样才会重复,单个列重复没事
replace如果存在冲突则替换,不存在冲突则插入

不存在冲突:

在工作中不建议直接替换老数据:

1:先按照条件去查询数据,看有没有相应的记录

2:没有的化就insert一个新数据

3:有的话,要么做update 要么把原数据的的删除标识设置为已删除,再写一个新数据
最后总结一下:

1一个表中只能由一个主键

2一个表中只能由一个自增

3一个主键可以包含多个列

4主键非空且唯一

七:FOREIGN KEY 外键约束

外键⽤于定义主表和从表之间的关系

外键约束主定义在从表的列上,主表关联的列必须是主键或唯⼀约束

当定义外键后,要求从表中的外键列数据必须在主表的主键或唯⼀列存在或为null。

学生表依赖班级表。

外键约束也是对数据的一种校验从表中使用了主要表的某个值,这个值必须要存在与主表中

创建班级表(主表),并初始化数据。

sql 复制代码
drop table if exists class;
 -- 建表
create table if not exists class (
 id bigint primary key auto_increment,
 name varchar(20) not null
);
insert into class (name) values ('java01'), ('java02'), ('java03'), ('C++01'), 
('C++02');
sql 复制代码
-- 外键语法
-- foreign key (class_id) references class(id)
-- 重构学生表,加入外键约束
foreign key 创建一个外键 
(class_id) 从表中的列  
references 外键引用 
class(id)主表中的id类
关联的列 从表的类型需要和主表的一样

重构学⽣表(从表),加⼊外键约束

sql 复制代码
drop table if exists student;
create table if not exists student(
id bigint PRIMARY KEY auto_increment, 
 name varchar(20) not null,
 age int DEFAULT 18,
 class_id bigint,
 foreign key (class_id) references class(id) # 创建外键约束
);

查看表结构,Key列的值为MUL表⽰外键约束的列

插入数据:

sql 复制代码
insert into student (name,age,class_id) VALUES('小李',11,1) ;
insert into student (name,age,class_id) VALUES('小杨',22,2) ;

查看表:

如果我们插入的class_id的常量没有在主表当中的id列会出现什么情况呢?

不能添加 因为有个外键约束。
删除主表某条记录时,从表中不能有对该记录的引⽤

我们先查看一下主从表中的数据:

当我们要删除主表中的数据 id=1的数据

就会出现报错信息,有一个父类的行,创建了外键的引用 不能删除

(当有从表的数据引用主表的时候 不可以删除主表中被引用的数据)

如果删除没有被引用的呢?让我们试一下:

从表没有被主表引用就会被删除。

当我们要删除主表时 看能不能行:

还是不可以的 因为存在外部引用

如果非要删除主表,则必须先删除从表中的数据,

如果要删除表,必须接触主外键关系。

八:DEFALUT 默认值约束

DEFAULT 约束⽤于向列中插⼊默认值,如果没有为列设置值,那么会将默认值设置到该列

重构学⽣表,新增年龄列

sql 复制代码
drop table if exists student;
create table if not exists student(
id bigint,
 name varchar(20) not null,
 age int
);
插⼊⼀条记录,没有设置默认约束时,不指定年龄的值时列为NULL
insert into student (id,name) values (1,'小李');
select *from student;

查看表数据:

我们现在的需求就是 当我们不给age设定值,用一个默认值填充,默认年龄为18

但是如果你指定了就按照指定的。(null也行)

sql 复制代码
drop table if exists student;
create table if not exists student(
 id bigint primary key auto_increment,
 name varchar(20) not null,
 age int default 18
);
insert into student (name) values ('小李');
select *from student;
相关推荐
编程爱好者熊浪17 小时前
两次连接池泄露的BUG
java·数据库
南宫乘风18 小时前
基于 Flask + APScheduler + MySQL 的自动报表系统设计
python·mysql·flask
TDengine (老段)19 小时前
TDengine 字符串函数 CHAR 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
qq74223498419 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
姚远Oracle ACE19 小时前
Oracle 如何计算 AWR 报告中的 Sessions 数量
数据库·oracle
Dxy123931021620 小时前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎20 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
杨云龙UP20 小时前
【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)
linux·运维·数据库·mysql·mssql
l1t20 小时前
利用DeepSeek辅助修改luadbi-duckdb读取DuckDB decimal数据类型
c语言·数据库·单元测试·lua·duckdb
安当加密20 小时前
Nacos配置安全治理:把数据库密码从YAML里请出去
数据库·安全