[MySQL/初学者]数据完整性约束

article/2025/10/20 5:29:50

 前言

数据完整性约束的概念:

在表中定义完整性约束是作为数据定义的一部分,定义了完整性约束,数据库会随时检测处于更新状态的数据库内容是否符合相关的完整性约束,保证数据的正确性一致性

完整性约束既能有效地防止对数据库的意外破坏非法存取,提高完整性检测的效率,还能减轻数据库编程人员的工作负担。

常用的约束条件有6种:

重点:主键约束(primary key)、外键约束(foreign key)、唯一性约束(unique)

           默认值约束(default)、非空约束(not null)、检查约束(check)。

数据完整性约束包括:

①:定义实体完整性(主键约束、候选键(即唯一性)约束)

②:定义参照完整性(外键约束)

③:用户定义完整性(非空约束、默认值、自增等)

Link Start!

目录

一、定义实体完整性(Entity Integrity)

1、主键约束(primary key)

2、唯一性(候选键)约束(unique)

 二、定义参照完整性(Referential Integrity)

1、外键约束(foreign key)

三、用户定义完整性(User-defined Integrity)

1、非空约束(not null)

2、默认值约束(default)

3、自增约束(auto_increment)

一、定义实体完整性(Entity Integrity

定义实体完整性:

实体完整性规则是指关系的主属性不能取空值,即主键和候选键在关系中所对应的属性不能取空值,实体完整性通过主键约束和候选键约束来实现的。

1、主键约束(primary key)

主键遵循的规则如下:

  1.  每一个表只能定义一个主键
  2. 主键的值(键值)能够唯一标识表中的每一行记录,且不能为null,即表中两条不同的记录在主键上不能具有相同的值。从中我们可以看出主键具有非空性与唯一性
  3. 组成复合主键的每一列都不能具有唯一性,但是每一列都具有非空性
  4. 一个列名在复合主键的列表中只能出现一次 

     5.定义主键约束后,数据库会自动为主键创建一个唯一索引,用于在查询中使用主键对数据进行快速检索,该索引名的默认为primary,也可以重新命名; 

添加主键的方式:create table 和alter table

1、create table方式:列级完整性约束[基础]/标记完整性约束

①:列级完整性约束法:只需在表中某字段定义后加上关键字primary key即可 。

添加主键后的效果:

 

无法插入空数据,因为主键具有非空性

无法插入相同的数据,因为主键具有唯一性,第二行代码重复插入了id "1",若把1换成其他数字,则成功。

 

 ②:表级完整性约束:需要在表中所有字段定义后添加一条primary key语法格式的子句。

可以定义一个字段为主键:

也可以定义多个字段为主键,称为复合主键:

注意:定义复合主键只能用表级完整性定义!!

③:修改表的方式:

alter table 方式:alter table 表名 add [constraint 约束名] primary key(字段列表)

④:删除主键

alter table 表名 drop primary key;

注意:该字段删除主键之后,仍然具有非空性,但不具有唯一性。

2、唯一性(候选键)约束(unique

如果希望表中的某个字段值不重复,是唯一的值,可以为该字段添加唯一性约束。

一张表中可以有多个唯一性约束,且满足唯一性约束的字段可以取null值,且由于唯一性的性质,只能取一个空值。

主键约束与候选键约束的区别如下:

  1. 一张表只能定义一个主键,但可以定义多个候选键;
  2. 定义主键的列不能为null,定义为候选键允许null存在;
  3. 定义主键约束时,系统会自动产生主键索引,定义候选键时,系统自动产生候选键索引

创建候选键约束用法:create table语句中使用关键字unique来实现。    

①:列级完整性约束方式定义候选键,及在某个字段后加关键字unique。

②:表级完整性约束方式定义候选键,并指定候选键约束名称,适合定义多列所构成的候选键。

其定义语法如下:

[constraint 约束名字 ] unique(列名1,..,列名n)

其中,MUL的意思为多个,表示该表有多个候选键。

那么在实际操作中要怎么知道到底哪些是候选键呢?

可以使用show 指令来进行查看:

show create table  表名 \G

③:修改表的方式:

alter table 表名 add [constraint 约束名字] unique(列名1,..,列名n); 

  ④:删除候选键约束用法:

Alter table语句中使用关键字UNIQUE来实现。    

删除候选键约束时,实际删除的是唯一性索引,应使用DROP INDEX子句删除.

如果没有给约束命名,自动将字段名定义为索引名

其用法如下:

alter tbale 表名 drop index 候选键约束名|候选键字段名;

 二、定义参照完整性(Referential Integrity

定义参照完整性的概念:

现实世界中的实体之间往往存在着某种联系,在关系模型中实体及实体之间的联系都是用关系来描述的,因此可能存在着关系与关系间的引用。

例如:学生实体和专业实体可以用下面的关系模式表示,其中主键用下划线标识:
学生(学号,姓名,性别,年龄,班级编号)
班级(班级编号,班级名称,年级,班级最大人数)


这两个关系之间存在着属性的引用,即学生关系引用了班级关系的主键“班级编号”。

显然,学生关系中的“班级编号”值必须在班级关系中确实存在的班级编号,即班级关系中有该班的记录。

这也就是说,学生关系中的“班级编号”的取值需要参照班级关系中“班级编号”的取值,“班级编号”是班级关系的主键,在学生关系中“班级编号”是外键。

定义参照完整性约束定义外键与主键之间的引用规则,即外键的取值或为空,或者等于被参照关系中的某个主键的值,需要遵守以下规则:

被参照表必须定义主键或候选键;

条件①:一定要先把被参照表定义好。

条件②:参照表外键对应的列的数目要和被参照表主键或者候选键对应的列的数目一致。

条件③:参照表外键对应的列的数据类型要和被参照表主键或者候选键对应的数据类型一致。

条件④:被参照表的主键不能为空,但是参照表外键允许为空。

条件⑤:只有存储引擎innodb支持外键,其他的不支持。

1、外键约束(foreign key

(——用于多表之间的操作——)

创建表的同时,创建外键约束,参照完整性约束方式定义外键,语法:

[constraint 外键约束名字] foreign key (外键对应列) references 被参照表(被参照表对应列);

例1:

先创建被参照表tb_class,该表包括班级编号,班级名称,所属院系,年级,班级最大人数,建表如下:

use db_school;create table tb_class(classno char(6)  primary key, classname varchar(20) , department varchar(30) ,grade int,classnum intconstraint uq_class unique(classname)
);

再创建参照表tb_student,要求定义classno为外键。

create table tb_student(studentno char(10),studentname varchar(20),sex char(2),birthday date,classno char(6) ,primary key(studentno),constraint fk_classno foreign key(classno) references tb_class(classno)
);

上面的语句中,constraint fk_student foreign key (classno)references tb_class(classno) 完成外键约束命名和定义;

也可以写成:foreign key(classno) references tb_class(classno), 这种写法没有给出约束名,系统会自动生成一个约束名

添加表约束,用alter table...add constraint语句为参照表添加外键约束,语法如下:

alter table  参照表  add  constraint  外键约束名  foreign key(参照表外键字段1,...字段名n) references 被参照表表名(被参照表字段名1,...字段名n);

例:为上面的tb_student中的 classname添加外键,约束名为fk_classname,sql语句如下:

alter table tb_student add constraint fk_classname foreign key(classname) references tb_class(classname);

修改表的方式:

alter table 表名 add [constrant 外键约束名] foregin key(外键对应列) reference 被参照表表名(主键或者候选键对应的列)

删除表外键约束

alter table 参照表 drop foreign key 外键约束名;

三、用户定义完整性(User-defined Integrity

概念:

针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。

主要包括非空约束、唯一约束、检查约束、主键约束、外键约束

1、非空约束(not null)

非空约束是指字段的值不能为null,null值就是没有值或值空缺, 不是空串(‘ ’)

对于使用了非空约束的字段,如果 用户在添加数据时没有给其指定值,数据库系统会报错。

在mysql中,非空约束的定义可以使用 create table 或 alter table语句,

某个列定义后面加上关键字 not null作为限定词,来约束该列的取值不能为空。

1、创建表时,为字段添加非空约束

mysql> create table d(-> id int not null,-> name varchar(30) not null,-> age int not null-> );
Query OK, 0 rows affected (0.01 sec)

 2、修改表,给已经存在的字段添加非空约束

alter table 表名 modify 字段名 数据类型 not null; 
mysql> alter table b modify age int not null;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

注意:如果对一个候选键添加非空约束,则该键变为主键。但之后的候选键进行相同操作时不能变换,因为主键具有唯一性。

例如以下 的id字段,其原本为候选键约束,但为其添加非空约束后变为了主键。

3、修改表,添加新的字段并添加非空约束条件

alter table 表名 add 新字段名 新数据类型 not null; 
mysql> alter table b add address varchar(60) not null;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

 4、删除表中字段的非空约束

alter table 表名 modify 字段名 数据类型 null; 
mysql> alter table b modify age int null;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

2、默认值约束(default)

默认值约束用指定一个字段的默认值。

如果没有在该字段值填写数据,则该字段将自动填入这个默认值。

1、创建表时,给字段增加默认值约束,

mysql> create table e(-> id int default  1,-> name varchar(30) default '张三',-> birth date default '2000-01-01'-> );
Query OK, 0 rows affected (0.01 sec)

 以上创建的e表中,id、name、birth三个字段给了默认值,

在插入数据的时候如果不输入其他值,给一个default,mysql会自动给默认值。

2、修改表,对表中已有的字段设置默认值

 alter table 表名 alter 字段名 set default  默认值; 
mysql> alter table b alter address set default '江软大';
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

 3、修改表,在表中新增字段且为该字段设置默认值

alter table 表名 add 字段名 数据类型 default  默认值

新增一个birth字段,为其设置默认值,并设置非空约束。

mysql> alter table b add birth date not null default '2020-4-1';
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

4、删除表中某个字段的默认值

alter table 表名 alter 字段名 drop default; 
mysql> alter table b alter address drop default;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

3、自增约束(auto_increment

在MySQL中,可通过关键字auto_increment为列设置自增属性,

只有——整型列——才能设置此属性,因为我们不可能对某个字母或者汉字进行自增,该约束针对的是数量。

每个表只能定义一个auto_increment列,而且前提是,必须先在该列上定义主键约束(primary key)或候选键(unique)

 

1:列级完整性约束方法,在创表时给字段增加自增约束:

creat table 表名(字段 数据类型 primary key|unique auto_increment);

 2:修改表的方法:

①:为表中已有的(已经定义为主键或候选键)字段增加自增约束

 

alter table 表名  modify 字段名 数据类型 auto_increment;

②:为表中新增字段并同时增加自增约束

alter table 表名 add字段名 数据类型 primary key auto_increment ;

 删除表的自增主键约束,分两步:

第一步,

修改该字段的数据类型方法,且新数据类型不能为int型,去除自增约束属性,方法如下:

alter table 表名 modify字段名 新数据类型;

第二步,

删除该字段的主键或者候选键,方法如下:

alter table 表名 drop primary key;alter table 表名 drop index 约束名|约束字段名;

 第三步,

将修改后的数据类型改为原本的int型,方法如下:

注:前两步不能颠倒顺序


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

相关文章

mysql实验五索引和数据完整性_实验六 索引和数据完整性约束

实验六索引和数据完整性约束 一、实验内容: 1、 索引的创建 2、 数据完整性约束的创建 二、实验项目:员工管理数据库 用于企业管理的员工管理数据库,数据库名为YGGL中,YGGL数据库中包括三个表:Employees(员工信息表)、Departments(部门信息表)、Salary(员工薪水情况表)。 …

MySQL数据库中数据完整性_MySQL数据完整性详细讲解及实现方式

一、数据完整性简介 1、数据完整性简介 数据冗余是指数据库中存在一些重复的数据,数据完整性是指数据库中的数据能够正确反应实际情况。 数据完整性是指数据的可靠性和准确性,数据完整性类型有四种: A、实体完整性:实体的完整性强制表的标识符列或主键的完整性(通过唯一约束…

数据传输完整性_数据集成:什么是数据完整性?

数据完整性是在数据生命周期中(从记录数据到销毁数据)整个过程中数据准确性和一致性的保证。简单来说,数据完整性意味着您已经按预期记录了数据,并且在整个生命周期中都没有意外出现。这个概念很简单,但实践却并非如此,数据完整性是任何大数据系统的重要关节之一。 数据完整…

MySQL数据库高级(一)——数据完整性

MySQL数据库高级(一)——数据完整性 一、数据完整性简介 1、数据完整性简介 数据冗余是指数据库中存在一些重复的数据,数据完整性是指数据库中的数据能够正确反应实际情况。数据的完整性是指数据的可靠性和准确性,数据完整性类型有四种:A、实体完整性:实体的完整性强制表…

数据完整性

数据完整性tip 一、 1、概念: 数据完整性是指存储在数据库中的数据要能正确反映实际情况,规定输入的数据不能是无效值、错误值或者乱码等。 2、数据完整性的类型: 实体完整性:标识符或主键的完整性,使其值唯一。域…

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

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

命令模式中介者模式

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

Linux 三种命令模式

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

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

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

C# 命令模式

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

命令模式(Command模式)详解

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

交换机基本命令模式

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

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

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

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

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

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

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

命令模式(行为型)

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

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

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

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

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

设计模式---命令模式

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

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

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