数据库约束

一,约束

约束即针对表的内容做出限制

创建表的时候,确定出来,跟随建表语句,一起被设置到数据库服务器中

mySQL中支持的一些约束

not null 非空约束 指定非空约束的列不能存储null值

defalut默认约束 当没有给列赋值时使用的默认值

unique唯一约束 指定唯一约束的列每行数据必须有唯一的值

primary key主键约束 not null和unique的结合,可以指定一个列或多个列,有助于防止数据重复和提高数据的查询性能(主键表示这一行/这一条记录的身份标识)

foreign key外键约束 外键约束是一种关系约束,用于定义两个表之间的关联关系,可以确保数据的完整性和一致性

check约束 用于限制列或数据在数据库中的值,确保数据的准确性和可靠性

1.1 not null

在查看表结构(例如:desc student)时,null列为NO表示值不允许为NULL,YES表示值可以为NULL

1.2 unique

unique确保这个值在所有行的对应列中,是唯一的

++对于空值是例外,空值和空值之间,不是视为重复的++

++在查看表结构时,Key列显示UNI表示唯一约束++

1.3 primary key主键约束

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

主键必须包含唯一的值,且不能包含NULL值

一个表里,只能有一个主键,可以是由单个列或者多个列组成

虽然不能允许多个主键,但是可以有一个主键包含多个列的联合主键

通常为每张表都指定一个主键,主键列建议使用bigint类型

1.3.1 实例

sql 复制代码
drop table student;

create table student(
  id bigint not null unique,
  name varchar(20) not null,
  age int default 18,
  sno varchar(20) unique
);

查看表结构时,添加了非空和唯一约束之后key列显示pri表示主键

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

主键设为整数类型=>自增主键

sql 复制代码
create table student(
  id bigint primary key auto_increment,
  name varchar(20) not null,
  age int default 18,
  sno varchar(10) unique
);

如果某条记录写入失败,则新生成的主键值会作废

sql 复制代码
insert into student(id,name,sno) values (null,'a','101');
insert into student(name,sno) values('b','102');
select * from student;

insert into student(name,sno) values('c','101');
insert into student(name,sno) values('d','103');
select* from student;

由于c插入失败了,所以3的id作废了

主键值可以不连续

sql 复制代码
insert into student(id,name,sno) values(100,'e','104');
insert into student(name,sno) values('e','105');

select* from student;

主键或唯一冲突时的更新操作,插入则更新

语法:insert......on duplicate key update column = value , column = value...

与update student set name = 'f',sno = '106' where id = 100;等效

替换,如果存在冲突则替换,不存在冲突则插入

语法:

sql 复制代码
replace [into] table_name
     [(column [,column] ...)]
values
    (value_list) [,(value_list)]...

value_list: value,[,value]...

表中不能有多个主键

一个表里面只能有一个主键

复合主键:由多个列共同组成的主键,主键是否冲突以多个列的组成进行判定

sql 复制代码
drop table student;

create table student(
  id bigint,
  name varchar(20),
  primary key(id,name) #指定复合主键
);

1.4 foreign key外键约束

语法:foreign key(id)references class(id);

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

外键约束定义在表的列上,主表关联的列必须时主键或唯一约束

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

当针对子表进行插入/修改的时候,就会查询父表,看你当前这个操作是否合法

针对父表进行删除/修改的时候,也会查询子表,也是要看当前操作是否合法

如果查询操作可以通过索引完成,此时查询的效率大大提升,因此,SQL强制要求使用外键的时候,被关键的父表。

被关联的这一列,必须带有索引。

针对主键列,默认就带有索引。

1.4.1 实例

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

sql 复制代码
drop table if exists class;
create table class(
  id bigint primary key auto_increment,
  name varchar(20) not null
);

insert into class(name) values('01'),('02'),('03');
select * from class;

2)重构学生表(从表),加入外键约束。

sql 复制代码
drop table if exists student;

create table 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)
);

desc student;

在上述查看表结构时,key列的值为MUL表示外键约束的列。

sql 复制代码
insert into student(name,class_id) values('张三',1),('李四',2);
select*from student;

insert into student(name,class_id) values('王五',100);

以上代码,插入一个班级号为100的记录会失败,因为主表中没有这个班级。

但是插入一个班级id为NULL的记录,可以成功,表示当前学生还没有分配班级。

删除主表中的某条记录时,从表中不能由对该记录的引用。

删除主表时要先删除从表。

1.5 check约束

可以应用于一个或多个列,用于限制列中可接受的数据值,从而确保数据的完整性和准确性。

实例:重构一个学生表,要求年龄不能小于16,性别只能是男或女。

sql 复制代码
drop table if exists student;

create table student(
  id bigint primary key auto_increment,
  name varchar(20) not null,
  age int default 18,
  gender char(1),
  check(age >= 16),
  check(gender = '男' or gender = '女')
);

desc table student;
相关推荐
宸丶一17 分钟前
Day 10:LangGraph - Agent 的图执行引擎
java·windows·python
hikktn18 分钟前
Excel 导出 OOM 预防实战:30 万行从堆溢出到 50MB 的演进
java·excel·easyexcel
风味蘑菇干20 分钟前
WTomcat服务器
java·服务器
无关868825 分钟前
Redis Bitmaps 用户签到系统设计方案
数据库·redis·缓存
江华森33 分钟前
FastAPI 极速开发指南 — 从零到生产级 API 实战
数据库·fastapi
燕-孑38 分钟前
tomcat详解(基础到高级生产)
java·tomcat
码不停蹄的玄黓1 小时前
Spring Bean 生命周期
java·后端·spring
西安邮电大学1 小时前
分治算法详细讲解
java·后端·其他·算法·面试
摇滚侠1 小时前
Mybatis 入门到项目实战 搭建 MyBatis 框架 01-14
java·tomcat·mybatis
左直拳1 小时前
mysql分区表自动归档
mysql·分区表·分区表归档