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;
相关推荐
大筒木老辈子4 小时前
MySQL笔记---C/C++访问MySQL数据库
数据库·笔记·mysql
友友马4 小时前
『 数据库 』MySQL复习(表的约束)
数据库·mysql
奥尔特星云大使4 小时前
MySQL分布式架构:MyCat详解
数据库·分布式·mysql·mycat·高可用
SelectDB技术团队4 小时前
Apache Doris 内部数据裁剪与过滤机制的实现原理 | Deep Dive
大数据·数据库·apache·数据库系统·数据裁剪
像风一样!5 小时前
学习MySQL数据库的高级特性(上)
数据库·mysql
夜泉_ly5 小时前
Redis -持久化
数据库·redis·缓存
Wx-bishekaifayuan6 小时前
基于微信小程序的社区图书共享平台设计与实现 计算机毕业设计源码44991
javascript·vue.js·windows·mysql·pycharm·tomcat·php
2401_837088506 小时前
什么是NoSQL?
数据库·nosql
哎呀呦呵7 小时前
python内置模块-re模块介绍使用
java·python·mysql