约束(constraint)

约束(constraint)一 什么是约束 约束英文 constraint 约束实际上就是表中数据的限制条件约束是表级的强制规定 可以在创建表时规定约束 通过 CREATE TABLE 语句 或者在表创建之后通过 ALTER TABLE 语句规定约束 二 约束作用 数据完整性 Data Integrity

大家好,我是讯享网,很高兴认识大家。

一、什么是约束

约束英文:constraint

约束实际上就是表中数据的限制条件约束是表级的强制规定。
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后通过 ALTER TABLE 语句规定约束。

二、约束作用

数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。

为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制。从以下四个方面考虑:

实体完整性(Entity Integrity) :例如,同一个表中,不能存在两条完全相同无法区分的记录
域完整性(Domain Integrity) :例如:年龄范围0-120,性别范围“男/女”
引用完整性(Referential Integrity) :例如:员工所在部门,在部门表中要能找到这个部门
用户自定义完整性(User-defined Integrity) :例如:用户名唯一、密码不能为空等,本部门经理的工资不得高于本部门职工的平均工资的5倍。

三、约束种类

 根据约束数据列的限制,约束可分为:

  • 单列约束:每个约束只约束一列
  • 多列约束:每个约束可约束多列数据

 根据约束的作用范围,约束可分为:

  • 列级约束:只能作用在一个列上,跟在列的定义后面
  • 表级约束:可以作用在多个列上,不与列一起,而是单独定义

 根据约束起的作用,约束可分为:

  • NOT NULL 非空约束,规定某个字段不能为空
  • UNIQUE 唯一性约束,规定某个字段在整个表中是唯一的
  • PRIMARY KEY 主键(非空且唯一)约束
  • FOREIGN KEY 外键约束
  • CHECK 检查约束
  • DEFAULT 默认值约束 

注意: MySQL不支持check约束,但可以使用check约束,而没有任何效果

四、非空约束

用not null约束的字段不能为null值,必须给定具体的数据

特点:

  • 默认,所有的类型的值都可以是NULL,包括INT、FLOAT等数据类型
  • 非空约束只能出现在表对象的列上,只能某个列单独限定非空,不能组合非空
  • 一个表可以有很多列都分别限定了非空
  • 空字符串''不等于NULL,0也不等于NULL

创建表,给字段添加非空约束(创建用户表,用户名不能为空)


讯享网

如果没有插入name字段数据,则会报错

 如何添加/删除约束:

五、唯一性约束 

unique约束的字段,具有唯一性,不可重复,但可以为null

 特点

  • 同一个表中可以有多个唯一约束
  • 唯一约束可以是某一个列的值是唯一
  • 唯一性约束运行值为空
  • 在创建唯一的约束时,如果不给他唯一约束命名,就默认和列名相同
  • MySQL会给唯一约束的列上默认创建一个唯一索引。

添加唯一约束

建表时:在CREATE TABLE时添加约束

在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。

可以向声明为unique的字段上添加NULL值,而且可以多次添加NULL值

在ALTER TABLE时添加约束

复合的唯一性约束

 

 删除唯一性约束

添加唯一性约束的列上也会自动创建唯一索引

删除唯一约束只能通过删除唯一索引的方式删除

删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样

如果创建唯一约束是未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么就默认和()中排第一位的列名相同

ALTER TABLE 表名 DROP INDEX 索引名;

六、PRIMARY KEY 约束

用来唯一标识表中的一行记录。

 关键字:

primary key

主键涉及术语

  • 主键约束
  • 主键字段
  • 主键值

以上三种术语关系

表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值

主键约束与“not null unique”区别

给某个字段添加主键约束之后,该字段不能重复也不能为空,效果和"not null unique"约束相同,但是本质不同。

主键约束除了可以做到"not null unique"之外,还会默认添加"索引——index"

一张表应该有主键字段,如果没有,表示该表无效

  • 主键值:是当前行数据的唯一标识、是当前行数据的身份证号
  • 即使表中两行记录相关数据相同,但由于主键值不同,所以也认为是两行不同的记录

按主键约束的字段数量分类

无论是单一主键还是复合主键,一张表主键约束只能有一个(约束只能有一个,但可以作用到好几个字段)

  • 单一主键:给一个字段添加主键约束
  • 复合主键:给多个字段联合添加一个主键约束(只能用表级定义)

特点:

  • 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。
  • 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。
  • 主键约束对应着表中的一列或者多列(复合主键)
  • 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
  • MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
  • 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
  • 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。

 单一主键(表级定义)

复合主键(表级定义)

 

 删除主键约束:(开发时不需要删除主键约束) 

 ALTER TABLE 表名称 DROP PRIMARY KEY;
说明:删除主键约束,不需要指定朱建明,因为一个表只有一个主键,删除主键约束后,非空还存在。

七、自增列:AUTO_INCREMENT

在MySQL数据库提供了一个自增的数字,专门用来自动生成主键值,主键值不用用户维护,自动生成,自增数从1开始,以1递增(auto_increment)

作用:某个字段的值自增

关键词:auto_increment

特点和要求

  1. 一个表最多只能有一个自增长列
  2. 当需要产生唯一标识符或顺序值时,可设置自增长
  3. 自增长列约束的列必须是键列(主键列,唯一键列)
  4. 自增约束的列的数据类型必须是整数类型
  5. 如果自增列指定了0和NULL,会在当前最大值的基础上自增,如果自增列手动指定了具体值,直接赋值为具体值。

如何指定自增约束

CREATE TABLE test7(
 id INT PRIMARY KEY AUTO_INCREMENT,
 last_name VARCHAR(15)
)

八、FOREIGN KEY外键约束

关键字

foreign key

什么是外键

若有两个表A、B,id是A的主键,而B中也有id字段,则id就是表B的外键,外键约束主要用来维护两个表之间数据的一致性。

A为基本表,B为信息表

作用

限定某个表的某个字段的引用完整性

比如:员工表的员工所在部门的选择,必须在部门表能够找到对应的部分。、

主表和从表/父表和子表

主表(父表):被引用的表,被参考的表

从表(子表):引用别人的表,参考别人的表

特点

(1)从表的外键列,必须引用/参考主表的键主键或唯一约束的列

为什么?因为被依赖/被参考的值必须是唯一的

(2)在创建外键约束时,如果不给外键约束命名。默认名不是列名,而是自动产生一个外键名,也可以指定外键约束名

(3)创建表时就指定外键约束的话,先创建主表,再创建从表

(4)删表时,先删从表,再删主表

(5)当主表的记录被从表参考时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据

(6)在“从表”中指定外键约束,并且一个表可以建立多个外键约束

(7)从表的外键列与主表被参考的列名字可以不相同,但是数据类型必须一样,逻辑意义一致。如果类型不一样,创建子表时,就会出现错误。

(8)当创建外键约束时,系统默认会在所在的列上建立对应的普通索引,但是索引名不是列名,不是外键的约束名。(根据外键查询效率更高)

(9)删除外键约束后,必须手动删除对应的索引

 

添加外键约束

(1)建表时

约束等级 

Cascade方式:在父表上update/delete记录时,同步update/delete掉子表的匹配记录
Set null方式:在父表盘上update/delete记录时,将子表上匹配记录的列设为null,但是需要注意子表的外键列不能为not null
No action方式:如果子表有匹配的记录,则不允许对父表对应候选键进行update/delete操作
Restrict方式:同no action,都是立即检测外键约束
Set default方式(在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别如果没有指定等级,就相当于Restrict方式

 删除外键约束

 

小讯
上一篇 2025-04-04 13:58
下一篇 2025-02-10 12:53

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/24529.html