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;
相关推荐
程序员小白条27 分钟前
你面试时吹过最大的牛是什么?
java·开发语言·数据库·阿里云·面试·职场和发展·毕设
老华带你飞42 分钟前
社区养老保障|智慧养老|基于springboot+小程序社区养老保障系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序·毕设·社区养老保障
q***69771 小时前
Y20030018基于Java+Springboot+mysql+jsp+layui的家政服务系统的设计与实现 源代码 文档
java·spring boot·mysql
Coding_Doggy1 小时前
链盾shieldchiain | 团队功能、邀请成员、权限修改、移除成员、SpringSecurity、RBAC权限控制
java·开发语言·数据库
凯子坚持 c1 小时前
不用复杂配置!本地 Chat2DB 秒变远程可用,跨网操作数据库就这么简单
数据库
q***65691 小时前
Windows环境下安装Redis并设置Redis开机自启
数据库·windows·redis
q***96581 小时前
Windows版Redis本地后台启动
数据库·windows·redis
q***81641 小时前
【Redis】centos7 systemctl 启动 Redis 失败
数据库·redis·缓存
q***09801 小时前
MySQL 常用 SQL 语句大全
数据库·sql·mysql