数据完整性

article/2025/10/20 14:04:26

数据完整性tip

一、

1、概念:

数据完整性是指存储在数据库中的数据要能正确反映实际情况,规定输入的数据不能是无效值、错误值或者乱码等。

2、数据完整性的类型:

  1. 实体完整性:标识符或主键的完整性,使其值唯一。
  2. 域完整性:限制类型、格式和取值范围。
  3. 引用完整性:保持原表和引用表数据的一致性。
  4. 自定义完整性:用户自定义的业务规则。

3、MySQL常用约束

请添加图片描述

二、各类约束的实现及注意点

1、非空约束关键字:not null


# 非空约束关键字:not nul(行级约束) 
-- 非空约束规定插入的属性值不能为空
create table teacher(
t_id int not null, -- 为教师编号添加非空约束
t_name varchar(20),
t_age int,
t_sex varchar(4)
);
insert into teacher(t_name,t_age,t_sex) values('小李',18,'男');      -- 错误:非空约束规定插入的属性值不能为空,如:t_id-- 报错:Error Code: 1364. Field 't_id' doesn't have a default value	0.000 secinsert into teacher values(1,'小王',18,'男');                        -- 正确;#以修改表结构的方式为某个属性添加非空约束 alter table teacher modify column t_name varchar(20) not null;#以修改表结构的方式为某个属性去掉非空约束 alter table teacher modify column t_name varchar(20);-- 注意:修改表的属性的时候,会对原表中的数据进行一个检查,如果出现取值冲突,则无法修改表约束-- eg:如果属性的取值已经存在空值,就不允许为这个属性添加非空约束 

2、唯一约束关键字:unique

#2、唯一约束关键字:unique(行级约束/表级约束) 
-- 唯一约束限制表中的属性取值不能重复,可以为空(但只有一个为null)
create table teacher(
t_id int not null unique, -- 为教师编号添加非空且唯一的约束
t_name varchar(20),
t_age int,
t_sex varchar(4)
);#以修改表结构的方式为某个属性添加唯一约束
alter table teacher add unique(t_id);alter table teacher add constraint uni_tid unique(t_id);
-- constraint关键字给约束unique(t_id)取一个别名为 uni_tid#以修改表结构的方式去掉某个属性的唯一约束 
alter table teacher drop index uni_tid;         -- 通过约束名删除约束(如果有取别名的话) alter table teacher drop index t_id;         -- 通过属性名删除约束(如果没有取别名的话) 

请添加图片描述

#复合唯一约束(表级约束):对多个列进行唯一约束 
create table teacher(
t_id int not null, -- 为教师编号添加非空约束
t_name varchar(20),
t_age int,
t_sex varchar(4),
constraint uni_tidname unique(t_id,t_name) -- 对多个字段创建复合唯一约束,使字段不能同时一致
);create table teacher1(
t_id int not null, -- 为教师编号添加非空约束
t_name varchar(20),
t_age int,
t_sex varchar(4),
unique(t_id,t_name) -- 对多个字段创建复合唯一约束,使字段不能同时一致
);#以修改表结构的方式为多个属性添加唯一约束
alter table teacher add constraint uni_tidname unique(t_id,t_name);-- 复合唯一约束不允许约束的属性列同时相同,至少要有一个不同#以修改表结构的方式为多个属性删除唯一约束
alter table teacher drop index uni_tidname;   -- 通过约束名删除多个属性约束(如果有取别名的话) -- 如果属性的取值已经存在重复值,就不允许为这个属性添加唯一约束 

3、主键约束:primary key(表级约束)

请添加图片描述

#3、主键约束:
-- 主键约束关键字:primary key(表级约束) 
-- 主键约束 = 非空约束 + 唯一约束。     非空且唯一   ||  用于规定实体完整性,唯一标识元组。
-- 主键是非空且唯一的,不允许有重复值或空值存在
-- 如果一个数据表中没有主键,那么第一个非空且唯一的属性会自动成为主键 
-- 一个数据表中非空且唯一的属性可以有多个,但是主键只能有一个(有且仅有一个) 
-- 定义主键时,如果表中数据存在重复或者为空,则添加主键会失败,所以应使主键数据不为空#1、创建表时添加主键约束
create table teacher(
t_id int primary key, -- 为教师编号创建主键约束
t_name varchar(20),
t_age int,
t_sex varchar(4)
);create table teacher1(
t_id int, 
t_name varchar(20),
t_age int,
t_sex varchar(4),primary key(t_id)   -- 添加主键约束
);#以修改表结构的方式为某个属性添加主键约束
alter table teacher add primary key(t_id);#由于表中第一个非空且唯一的属性会默认成为主键,所以创建主键前要先删除这个属性的唯一约束
alter table teacher drop index uni_tidname;#以修改表结构的方式   删除主键约束
alter table teacher drop primary key;
-- 由于一个表的的主键只有一个,直接丢掉即可,只要规定表名,可以不写约束名#创建联合主键
alter table teacher add primary key(t_id,t_name);-- 数据表中可能存在多个属性同时作为一个主键的情况,也就是一个主键包含多个属性-- 多列作为联合主键,其主键的取值不能为空,且不能同时重复-- 如果属性的取值已经存在空值和重复值,就不允许为这个属性添加主键约束 

4、自增列:auto_increment

自增列约束关键字:auto_increment(行级约束)
在这里插入图片描述

#4、自增列约束auto_increment(行级约束)
-- 对添加了自增列约束的属性,如果不给定属性的取值,它就会根据上一个属性的取值自动+1
-- 给一个属性添加自增列约束时,需要这个属性已经有唯一性质的约束,一般只为主键添加自增列#创建一个数据表,使表中某个属性成为主键,并为主键添加自增列:
create table teacher(
t_id int primary key auto_increment, -- 为教师编号创建主键和自增列约束默认从100开始
t_name varchar(20),
t_age int,
t_sex varchar(4)
)auto_increment = 100;   -- 设置自增列的默认初始值从100开始#修改表添加自增列:
alter table teacher modify column t_id int auto_increment;#插入值
insert into teacher(t_name,t_age,t_sex) values('K',26,'男'),('S',23,'男'),('M',20,'女');#删除自增列
alter table teacher modify column t_id int;
-- 在修改表时不添加自增列就是删除自增列

5、默认值约束:default(行级约束)

请添加图片描述

-- 插入数据时如果不给定属性的取值,那么带有默认值约束的属性会自动使用给定的默认值-- 创建一个数据表,规定表中某个属性的默认值
create table staff( -- 员工表
staff_id int primary key, -- 工号(主键)
staff_name varchar(30), -- 员工姓名
staff_gender varchar(4) default '男', -- 员工性别(默认为'男')
staff_age int
);-- 以修改表结构的方式为某个主键添加默认值约束
alter table staff modify column staff_gender varchar(4) default '男';insert into staff(staff_id,staff_name) values(4,"赵六");-- 以修改表结构的方式去掉某个属性的默认值约束
alter table staff modify column staff_gender varchar(4);

6、检查约束:check(表级约束)

请添加图片描述

# 6、检查约束check(表级约束)-- 检查约束用于规定和限制属性的取值范围-- 创建一个数据表,规定表中某个属性的取值范围
create table staff( -- 员工表
staff_id int primary key, -- 工号(主键)
staff_name varchar(30), -- 员工姓名
staff_gender varchar(4) check(staff_gender = "男" or staff_gender = "女"), -- 员工性别
staff_age int check(staff_age >= 0 and staff_age <= 100)
);create table staff1( -- 员工表
staff_id int primary key, -- 工号(主键)
staff_name varchar(30), -- 员工姓名
staff_gender varchar(4) , -- 员工性别
staff_age int,
check(staff_gender = "男" or staff_gender = "女"),check(staff_age >= 0 and staff_age <= 100)
);-- 以修改表结构的方式为某个属性添加检查约束
alter table staff add check(staff_age >= 0 and staff_age <= 100);
alter table staff add check(staff_gender = "男" or staff_gender = "女");insert into staff values(5,"小花","女",28);insert into staff values(6,"小敏","女",-1); -- 错误:不允许年龄小于0-- 查看表约束
desc staff;

7、外键约束:foreign key(表级约束)

请添加图片描述

级联更行/删除:
请添加图片描述

7、外键约束foreign key(表级约束)-- 外键约束用于描述两个或两个以上实体集之间的联系-- 外键约束用于表示参考完整性,外键值参考主键值,外键不能参考其他非主属性-- 在创建外键所在的参考表之前,需要先创建被参考表-- 在创建员工表之前,需要先创建被参考表(父表):部门表
create table department_tb( -- 部门表
d_id int primary key auto_increment, -- 部门编号
d_name varchar(20) not null, -- 部门名称
d_number int default 0 -- 部门员工人数
)auto_increment = 100;-- 部门表数据的插入
insert into department_tb(d_name) values("人事部"),("行政部"),("财务部"),("销售部"),("生产部");-- 创建员工表
create table staff_tb( -- 员工表
staff_id int primary key auto_increment, -- 工号
staff_name varchar(30) not null, -- 员工姓名
staff_did int, -- 部门编号
staff_gender varchar(4) check(staff_gender = "男" or staff_gender = "女"), -- 员工性别
staff_age int check(staff_age >= 0 and staff_age <= 100),
constraint for_sdid foreign key(staff_did) references department_tb(d_id)-- 外键:员工表中的部门编号参考于部门表中的部门编号
)auto_increment = 1000;-- 插入员工信息(正确的测试数据)
insert into staff_tb(staff_name,staff_did,staff_gender,staff_age)values("小芳",102,"女",26);-- 插入员工信息(测试外键约束)
insert into staff_tb(staff_name,staff_did,staff_gender,staff_age)values("小刚",105,"男",28); -- 错误:不存在105号部门# 外键约束的级联更新/删除-- 父表数据的更新/删除对子表数据的影响-- 参考表和被参考表中存在相关联数据(对应的数据),就不能参数或修改被参考表(父表)中的数据
delete from department_tb where d_id = 102; -- 可以删除吗? -- 不可以-- 创建员工表
create table staff_tb( -- 员工表
staff_id int primary key auto_increment, -- 工号
staff_name varchar(30) not null, -- 员工姓名
staff_did int, -- 部门编号
staff_gender varchar(4) check(staff_gender = "男" or staff_gender = "女"), -- 员工性别
staff_age int check(staff_age >= 0 and staff_age <= 100),
constraint for_sdid foreign key(staff_did) 
references department_tb(d_id) -- 外键:员工表中的部门编号参考于部门表中的部门编号on update cascade on delete set null -- 设置级联更新/删除-- on update set null -- 仅设置级联更新-- on delete cascade -- 仅设置级联删除
)auto_increment = 1000;

http://chatgpt.dhexx.cn/article/ye0gkbSy.shtml

相关文章

Java设计模式(18)之命令模式

命令模式 将“请求”封装成对象&#xff0c;以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。命令模式通过这种封装的方式实现将客户端和接收端解耦。 类型&#xff1a; 行为型模式&#xff08;类与类之间的行为型模式&#xff09; 命令模…

命令模式中介者模式

有情怀&#xff0c;有干货&#xff0c;微信搜索【三太子敖丙】关注这个有一点点东西的程序员。 本文 GitHub https://github.com/JavaFamily 已收录&#xff0c;有一线大厂面试完整考点、资料以及我的系列文章。 最近在跟大家分享设计模式系列的文章有学妹问我&#xff0c;命令…

Linux 三种命令模式

vim :文本编辑器 vim的三种模式&#xff1a;命令模式、输入模式、底线命令模式 命令模式:即用户刚刚启动的Vim模式 常用命令 i 切换到输入模式&#xff0c;输入字符。x 删除当前光标所在出的字符。: 切换到底线命令模式&#xff0c;一在最底行输入命令。 输入模式:在命令模…

【源码分析设计模式 13】命令模式

一、基本介绍 1、在软件设计中&#xff0c;我们经常需要向某些对象发送请求&#xff0c;但是并不知道请求的接收者是谁&#xff0c;也不知道被请求的操作时哪个&#xff0c;我们只需在程序运行时指定具体的请求接收者即可&#xff0c;此时&#xff0c;可以使用命令模式来进行设…

C# 命令模式

一、命令模式&#xff1a; 将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 ——《设计模式》 二、模式结构&#xff1a; Command&#xff1a; 定义命令的接口&#xff…

命令模式(Command模式)详解

在软件开发系统中&#xff0c;常常出现“方法的请求者”与“方法的实现者”之间存在紧密的耦合关系。这不利于软件功能的扩展与维护。例如&#xff0c;想对行为进行“撤销、重做、记录”等处理都很不方便&#xff0c;因此“如何将方法的请求者与方法的实现者解耦&#xff1f;”…

交换机基本命令模式

交换机基本命令模式 对于思科交换机来说&#xff0c;主要有2种配置途径&#xff1a; 其一&#xff0c;使用交换机自带的Console线缆连接到计算机的COM口&#xff0c;然后利用计算机的超级终端软件直接配置&#xff0c;首次配置通常使用这种方式&#xff1b; 其二&#xff0c;通…

Java设计模式及应用场景之《命令模式》

文章目录 一、命令模式定义二、命令模式的结构和说明三、命令模式示例四、命令模式扩展 -- 宏命令示例五、命令模式扩展 -- 可撤销和恢复操作示例1、反操作式&#xff08;补偿式&#xff09;2、存储恢复式 六、命令模式扩展 -- 队列请求七、命令模式扩展 -- 日志请求八、命令模…

【每天一个java设计模式(十五)】 - 命令模式

命令模式是一种数据驱动的设计模式&#xff0c;它属于行为型模式。请求以命令的形式包裹在对象中&#xff0c;并传给调用对象。调用对象寻找可以处理该命令的合适的对象&#xff0c;并把该命令传给相应的对象&#xff0c;该对象执行命令。 命令模式也就是一个用户发送请求&…

码农小汪-设计模式之-命令模式

大话设计模式的例子讲的非常的好&#xff0c;理解起来也方便&#xff01;有时候忘了。想到这些特殊的例子感觉就是特别爽。 烤羊肉串带来的思考&#xff01; 路边摊羊肉串&#xff1a; 老板&#xff0c;我这里排的比较先啊&#xff0c;我最先给钱。老板这个没有熟啊。我的是…

命令模式(行为型)

一、什么是命令式 命令(Command)模式又叫作动作(Action)模式或事务(Transaction)模式&#xff0c;是一种对象的行为模式。将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤消的操作…

命令模式---电视机遥控器

电视机是请求的接收者&#xff0c;遥控器是请求的发送者&#xff0c;遥控器上有一些按钮&#xff0c;不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮演&#xff0c;有三个具体的命令类实现了抽象命令接口&#xff0c;这三个具体命令类分别代表三种操作&#…

C++设计模式-命令模式

目录 基本概念 代码与实例 基本概念 命令模式&#xff08;Command&#xff09;&#xff0c;将一个请求封装为对象&#xff0c;从而使你看用不同的请求对客户端进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销操作。 命令模式的作用&#xff1a; …

设计模式---命令模式

命令模式 命令模式的定义 ​ 命令模式是一个高内聚的模式&#xff0c;其定义为&#xff1a;Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.&#xff08;将一…

【设计模式】命令模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

文章目录 一、命令模式简介二、命令模式 适用场景三、命令模式 优缺点四、命令模式 与 备忘录模式五、命令模式 代码示例1、命令接口2、发布命令类3、关闭命令类4、游戏类5、命令执行者类6、测试类 一、命令模式简介 命令模式 : 将 不同的请求 封装成 不同的请求对象 , 以便 使…

设计模式(16)命令模式

**定义&#xff1a;**将一个请求封装成一个对象&#xff0c;从而让你使用不同的请求把客户端参数化&#xff0c;对请求排队或者记录请求日志&#xff0c;可以提供命令的撤销和恢复功能。 **类型&#xff1a;**行为类模式 类图&#xff1a; 命令模式的结构 ​ 顾名思义&#…

什么是命令模式?

一、命令模式的定义 命令是对命令的封装&#xff0c;每一个命令都是一个操作&#xff0c;请求方发出请求&#xff0c;接收方接收请求&#xff0c;并执行操作。命令模式解耦了请求方和接收方&#xff0c;命令模式属于行为型模式 二、命令模式的uml图和通用写法 uml 通用写法 …

设计模式之命令模式详解

1 概述 日常生活中&#xff0c;我们出去吃饭都会遇到下面的场景。我们可以将女招待理解成一个请求的发送者&#xff0c;用户通过它来发送一个“点餐”请求&#xff0c;而厨师是“点餐”请求的最终接收者和处理者&#xff0c;在图中&#xff0c;顾客和厨师之间并不存在直接耦合…

命令模式

一、命令模式介绍 在软件设计中&#xff0c;我们经常需要向某些对象发送请求&#xff0c;但是并不知道请求的接收者是谁&#xff0c;也不知道被请求的操作是哪个。我们只需要在程序运行时指定具体的请求接收者即可&#xff0c;此时可以使用命令模式来设计。 命令模式使得请求发…

Java设计模式——命令模式

文章目录 命令模式 命令模式 命令模式很好理解&#xff0c;举个例子&#xff0c;司令员下令让士兵去干件事情&#xff0c;从整个事情的角度来考虑&#xff0c;司令员的作用是&#xff0c;发出口令&#xff0c;口令经过传递&#xff0c;传到了士兵耳朵里&#xff0c;士兵去执行…