首页 > 数据库 >数据库约束

数据库约束

时间:2024-11-21 22:17:09浏览次数:3  
标签:NULL name into id values student 约束 数据库

数据库约束

什么是数据库约束

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

约束类型

类型说明
NOT NULL ⾮空约束指定⾮空约束的列不能存储 NULL 值
DEFALUT 默认约束当没有给列赋值时使⽤的默认值
UNIQUE 唯⼀约束指定唯⼀约束的列每⾏数据必须有唯⼀的值
PRIMARY KEY 主键约束NOT NULL 和 UNIQUE的结合,可以指定⼀个列或多个列,有助于防⽌数据重复和提⾼数据的查询性能
FOREIGN KEY 外键约束外键约束是⼀种关系约束,⽤于定义两个表之间的关联关系,可以确保数据的完整性和⼀致性
CHECK 约束⽤于限制列或数据在数据库表中的值,确保数据的准确性和可靠性

NOT NULL ⾮空约束

定义表时某列不允许为NULL时,可以为列添加⾮空约束。
• ⽐如创建⼀个学⽣表,学⽣名为NULL时,这条记录是不完整的

# 建表
# 建表
drop table if exists student;
create table student(
	id bigint,
	name varchar(20)
);

# 插入数据
insert into student values(1,NULL);

# 查询
select * from student;

在这里插入图片描述

desc student;

在这里插入图片描述

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

drop table if exists student;
create table student(
	id bigint,
	name varchar(20) NOT NULL
);

# 插入数据
insert into student values(1,NULL);

在这里插入图片描述

insert into student values(1,'张三');

select * from student;

在这里插入图片描述
• 查看表结构,NULL列为NO表⽰值不允许为NULL,YES表⽰值可以为NULL

desc student;

在这里插入图片描述

DEFALUT 默认值约束

DEFAULT 约束⽤于向列中插⼊默认值,如果没有为列设置值,那么会将默认值设置到该列
• 重构学⽣表,新增年龄列

drop table if exists student;
# 创建学生表,加⼊年龄列
create table student(
	id bigint,
	name varchar(20) NOT NULL,
	age int
);

• 插⼊⼀条记录,没有设置默认约束时,不指定年龄的值时列为NULL

insert into student(id,name) values (1,'张三');

select * from student;

在这里插入图片描述
• 重构学生表,为年龄的列加入默认约束

drop table if exists student;
# 为年龄列加上默认约束
create table student(
 id bigint,
 name varchar(20) NOT NULL,
 age int DEFAULT 18
);

• 插⼊⼀条记录,不指定年龄的值时列使⽤了默认值

insert into student(id, name) values (1,'张三');

select * from student;

在这里插入图片描述
• 查看表结构,年龄列的默认值为18

desc student;

在这里插入图片描述
• 当⼿动明确指年龄列为NULL时列值为NULL

insert into student values(2,'李四',NULL);

select * from student;

在这里插入图片描述

UNIQUE 唯⼀约束

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

drop table if exists student;
# 学号列设置唯一约束
create table student(
	id bigint,
	name varchar(20) NOT NULL,
	age int DEFAULT 18,
	sno varchar(10)
);

• 不设置唯⼀约束时,学号可以重复

insert into student(id,name,sno) values (1,'张三','202401');

insert into student(id,name,sno) values(2,'李四','202401');

select * from student;

在这里插入图片描述
• 重构学⽣表,为学号列设置唯⼀约束

drop table if exists student;
create table student(
	id bigint,
	name varchar(20) NOT NULL,
	age int DEFAULT 18,
	sno varchar(10) UNIQUE	#唯一约束
);

• 插⼊重复的学号时报错,唯⼀约束⽣效

insert into student(id,name,sno) values (1,'张三','202401');

insert into student(id,name,sno) values (2,'李四','202401');

在这里插入图片描述

select * from student;

在这里插入图片描述
• 查看表结构,Key列显⽰UNI表⽰唯⼀约束

desc student;

在这里插入图片描述

PRIMARY KEY 主键约束

主键约束唯⼀标识数据库表中的每条记录。
主键必须包含唯⼀的值,且不能包含 NULL 值。
每个表只能有⼀个主键,可以由单个列或多个列组成。
通常为每张表都指定⼀个主键,主键列建议使⽤BIGINT类型

• 重构学⽣表,为ID列添加⾮空和唯⼀约束

drop table if exists student;
create table student(
	id bigint NOT NULL UNIQUE ,
	name varchar(20) NOT NULL,
	age int DEFAULT 18,
	sno varchar(10) UNIQUE
);

• 查看表结构,添加了⾮空和唯⼀约束之后Key列显⽰PRI表⽰主键

desc student;

在这里插入图片描述
• 当Id列的重复或NULL时会发⽣主键冲突

insert into student(id,name,sno) values (1,'张三','202401');

insert into student(id,name,sno) values (1,'李四','202402');

insert into student(id,name,sno) values (NULL,'李四','202402');

select * from student;

在这里插入图片描述

在这里插入图片描述
• 通常把主键列设置为⾃动增⻓,让数据库维护主键值

drop table if exists student;
# 重构学生表
create table student(
	id bigint PRIMARY key auto_increment,		# 设置自增主键
	name varchar(20) NOT NULL,
	age int DEFAULT 18,
	sno varchar(10) UNIQUE
);

• 插⼊数据时不设置主键列的值

# 主键列的值为NULL
insert into student(id,name,sno) values (NULL,'张三','202401');

# 不指定主键
insert into student(name,sno) values ('李四','202402');

select * from student;

主键列的值⾃动⽣成
在这里插入图片描述
• 查看表结构,Extra列显⽰auto_increment 表⽰⾃增

desc student;

在这里插入图片描述
• 如果某条记录写⼊失败,新⽣成的主键值将会作废

# 由于学号重复,产生了唯一冲突,导致插入失败,ID为3的主键值作废
insert into student(name,sno) values('王五','202402');

在这里插入图片描述

# 修改学号后成功插入数据
insert into student(name,sno) values('王五','202403');

# 查询后发现新记录ID列的值为4
select * from student;

在这里插入图片描述
• 主键值可以不连续

# 手动指定一个值
insert into student(id,name,sno) values (100,'赵六','202404');

select * from student;

在这里插入图片描述

# 下一次自增从主键的最大值开始
insert into student(name,sno) values ('钱七','202405');

select * from student;

在这里插入图片描述
ID列的值是101

• 主键或唯⼀键冲突时的更新操作,插⼊否则更新

# 语法
INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value] ...
# 插入ID为100,学号为100100的学号记录时,报主键冲突
insert into student(id,name,sno) values (100,'赵六','2024100');

在这里插入图片描述

# 可以使用以上语法,如果插入时有冲突则更新当前列的值
insert into student(id,name,sno) values (100,'赵六','2024100')
			on duplicate key update name = '赵六',sno = '2024100';

在这里插入图片描述

select * from student;

在这里插入图片描述
• 替换,如果存在冲突则替换,不存在冲突则插⼊

# 语法
REPLACE [INTO] table_name
	[(column [, column] ...)]
VALUES
	(value_list) [, (value_list)] ...
value_list: value, [, value] ...
# 写入或更新Id为101的记录
replace into student(id,name,sno) values (101,'钱七',2024101);

在这里插入图片描述

# 原数据已更新
select * from student;

在这里插入图片描述

# 写入一条新数据
replace into student(id,name,sno) values (102,'吴八',2024102);

在这里插入图片描述

# 成功写入
select * from student;

在这里插入图片描述
• 表中不能有多个主键

drop table if exists student;
create table student(
	id bigint PRIMARY key auto_increment,	# 定义主键
	name varchar(20) PRIMARY key # 定义主键
);

在这里插入图片描述
• 复合主键:由多个列共同组成的主键,主键是否冲突以多个列的组成进⾏判定

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

# 插入数据
insert into student values (1,'张三');
# 重复插入主键冲突,此时主键值由id和name两个列共同决定
insert into student values (1, '张三');

在这里插入图片描述

# 修改id值插入成功
insert into student values (2,'张三');

select * from student;

在这里插入图片描述

FOREIGN KEY 外键约束

外键⽤于定义主表和从表之间的关系
外键约束主定义在从表的列上,主表关联的列必须是主键或唯⼀约束
当定义外键后,要求从表中的外键列数据必须在主表的主键或唯⼀列存在或为null。

在这里插入图片描述
• 创建班级表(主表),并初始化数据

# 建表
drop table if exists class;
create table class(
	id bigint PRIMARY key auto_increment,
	name varchar(20) NOT NULL
);

# 初始化数据
insert into class(name) values ('1班'),('2班'),('3班'),('4班');

select * from class;

在这里插入图片描述
• 创建学⽣表(从表),并初始化数据

# 建表
drop table if exists student;
create table student(
	id bigint PRIMARY key auto_increment,
	name varchar(20) NOT NULL,
	class_id bigint
);

# 初始化数据
insert into student(name, class_id) values ('张三',2),('李四',1),('王五',4),('赵六',3);

select * from student;

在这里插入图片描述
• 写入一条学生记录,设置了不存的班级编号,数据是可以写入成功的

insert into student(name,class_id) values ('钱七',5);

select * from student;

在这里插入图片描述
• 重构学⽣表(从表),加⼊外键约束

# 语法
foreign key (id) references class(id)
# 重构表
drop table if exists student;
create table student(
	id bigint PRIMARY key auto_increment,
	name varchar(20) NOT NULL,
	class_id bigint,
	foreign key(class_id) references class(id)	# 创建外键约束
);

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

desc student;

在这里插入图片描述
• 正常插⼊数据

# 班级编号在主表中存在
insert into student(name,class_id) values ('张三',2), ('李四',4);

# 插入成功
select * from student;

在这里插入图片描述
• 插⼊⼀个班级号为100的学⽣,由于主表中没有这个班级,插⼊失败

# 班级编号在主表中不存在,提示外键约束限制导致插入失败
insert into student(name,class_id) values ('王五',100);

在这里插入图片描述
• 插⼊班级Id为NULL的记录,可以成功,表⽰当前学⽣还没有分配置班级

# 班级为NULL
insert into student(name,class_id) values ('王五',NULL);

select * from student;

在这里插入图片描述
• 删除主表某条记录时,从表中不能有对该记录的引⽤

# 删除主表中没有被引用的记录,可以成功
delete from class where id = 3;

select * from class;

在这里插入图片描述

# 删除主表中被引用的记录,失败
delete from class where id = 2;

在这里插入图片描述
• 删除主表被引用的记录时要先删除从表中所有引用的记录

# 删除从表中引用主表id=2的记录
delete from student where class_id = 2;

# 删除主表中 id=2 的记录
delete from class where id = 2;

select * from student;

select * from class;

在这里插入图片描述
在这里插入图片描述

CHECK 约束

可以应⽤于⼀个或多个列,⽤于限制列中可接受的数据值,从⽽确保数据的完整性和准确性。
在8.0.16开始全⾯⽀持CHECK约束,之前的版本会忽略CHECK的定义

• 重构学⽣表,有以下要求,年龄不能⼩于16岁,性别只能是男或⼥

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 = '女')
);
# 正常插入数据
insert into student(name,age,gender) values ('张三',17,'男'),('李四',20,'女');

select * from student;

在这里插入图片描述

# 插入年龄小于16岁的记录,失败
insert into student(name,age,gender) values ('张三',14,'男');

在这里插入图片描述

# 插入性别的值不是男或女的记录,失败
insert into student(name,age,gender) values ('张三',18,'保密');

在这里插入图片描述
• 创建新表,c1的值不能为0,c2的值必须⼤于0,c3的值不⼩于c2

# 列与列之间也可以⽐较,需要在单独⼀⾏中定义
drop table if exists t_check;
create table t_check(
	c1 int check (c1 <> 0),
	c2 int check (c2 > 0),
	c3 int,
	check(c3 >= c2)
);

# 插入正常数据
insert into t_check values(3,6,8);

select * from t_check;

在这里插入图片描述

# c1 = 0时,失败
insert into t_check values (0,6,9);

在这里插入图片描述

# c2 <= 0时,失败
insert into t_check values (1,-12,4);

在这里插入图片描述

# c3 < c2时,失败
insert into t_check values (3,6,5);

在这里插入图片描述


关于数据库约束,先了解到这里,希望这篇文章对大家有帮助,谢谢大家的阅读!!!

标签:NULL,name,into,id,values,student,约束,数据库
From: https://blog.csdn.net/2201_76124988/article/details/143941701

相关文章

  • SSMJava旅游资源管理系统3ca4b程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着旅游业的快速发展,旅游资源的有效管理成为提升旅游体验和服务质量的关键。设计并实现一个基于Java的旅游资源管理系统,旨在提......
  • SSMppg玩家论坛2znlp--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义PPG(PaintballGaming)作为一种新兴的射击运动,近年来在全球范围内迅速兴起,吸引了大量玩家和爱好者的关注。然而,目前市场上缺乏一......
  • kettle spoon连接mysql数据库报错 [mysql] : org.pentaho.di.core.exception.KettleDa
    先说结论。因为kettle/lib文件夹下没有对应版本的ar包,导致链接不上mysql。找到kettle下载文件,地址在 kettle/data-integration/lib 下载两个文件,一个5.1.41-bin文件,另一个对应自己mysql版本的jar包文件,下面举例我安装的8.0.24版本 将下载的两个jar包复制到 kettle/da......
  • SSMJava健身会所信息系统设计与实现5iab7--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着健康意识的提升,健身会所已成为人们追求健康生活的重要场所。然而,传统的人工管理方式存在效率低下、信息不准确等问题,难以满......
  • SSMBB物资租借系统hq51e(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景随着商业活动的日益频繁,各类物资的租借需求不断增长。传统的租借方式存在流程繁琐、效率低下、管理不便等问题。为解决这些问题,我们......
  • 计算机毕业设计推荐】基于SpringBoot+Vue的软件产品展示销售系统的设计与实现 【附源
    ✍✍计算机编程指导师⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java实战|SpringBoot/SSMPython实战项目|Django微信小程......
  • 使用SqlSugar ORM框架在WinForms中连接SQLite数据库
    一,简洁SqlSugar是一个.NET平台下的ORM框架,它支持多种数据库,包括SQLite。在WinForms应用程序中使用SqlSugar可以简化数据库操作,提高开发效率。本文将指导您如何在WinForms应用程序中使用SqlSugar连接SQLite数据库。二,环境准备WinForms项目:在VisualStudio中创建或打开一个WinFor......
  • 【数据库开发】数据库生成唯一序号
    在数据库管理系统中,序列(Sequence)是一种数据库对象,主要用于生成唯一的数值。不同的数据库系统对序列的支持方式可能不同。下面是DB2和MySQL中关于序列的一些信息:DB2中的序列在IBM的DB2数据库中,序列是一个独立的对象,可以被多个表或应用程序共享。通过使用CREATESEQUENCE语句来创......
  • Spring Boot 集成 Flyway,数据库也能做版本控制,太牛逼了!
     一、Flyway是什么?  我们都知道,Git/SVN是代码界的版本控制工具,那么,Flyway就是一款数据库界的版本控制工具,它可以记录数据库的变化记录。 可能很多公司都是通过人工去维护、同步数据库脚本,但经常会遇到疏忽而遗漏的情况,举个简单的例子: 我们在开发环境对某个表新......
  • springboot服装生产管理的设计与实现(代码+数据库+LW)
    摘  要本协力服装厂服装生产管理系统设计目标是实现协力服装厂服装生产的信息化管理,提高管理效率,使得协力服装厂服装生产管理作规范化、科学化、高效化。本文重点阐述了协力服装厂服装生产管理系统的开发过程,以实际运用为开发背景,基于Springboot框架,运用了Java编程语言和M......