MySQL 约束控制

文章详细介绍了数据库中的约束类型,包括非空约束、主键约束、默认值约束、唯一约束和外键约束,强调了它们在确保数据完整性和准确性方面的作用。主键约束保证唯一性且默认非空,而外键约束则维护了表间的关系。默认值约束允许字段在未指定值时有预设值,而唯一约束则确保字段值的唯一,但可以有多个。文章还通过示例展示了如何在MySQL中创建和应用这些约束。
摘要由CSDN通过智能技术生成


约束控制

在这里插入图片描述

数据的完整性约束(简称“约束”)是在表和字段上强制执行的数据检测规则,是为了防止不规范的数据进入数据库。当我们对数据进行 DML 操作时,数据库管理系统(DBMS)会自动按照我们设置的约束条件对数据进行检测,以保证数据存储的完整性和准确性。

完整性约束分为 4 类:实体完整性约束、域完整性约束、参照完整性约束、用户自定义完整性约束。

  • 实体完整性约束:用来标识表中的每一条记录都代表一个实体,如主键约束;
  • 域完整性约束:用来针对单元格的约束,如非空约束等;
  • 参照完整性约束:指多表之间的对应关系,在一张表中执行数据插入、更新、删除等操作时,DBMS 都会跟另一张表进行对照,避免不规范的操作,以确保数据存储的完整性,如外键约束;
  • 用户自定义完整性约束:用户根据实际的要求来定义,在执行数据插入、更新等操作时,DBMS 会检查数据是否满足检查约束中的限定条件,避免不符合条件的操作,以保证数据存储的准确性,如检查约束(MySQL 不支持,Oracle 支持)。

在 MySQL 中支持的约束有 6 种,分别是:非空约束、主键约束、默认值约束、唯一约束、外键约束和自定义检查约束。

根据约束添加的位置,我们可以把约束分为两类:

  • 列级约束:即直接在定义的字段名和类型后面追加约束。但该方式只支持默认值约束、非空约束、主键约束、唯一约束。
  • 表级约束:即在各个字段定义完后进行添加。表级约束不支持非空约束和默认值约束。

非空约束

创建非空约束使用的语句是 NOT NULL,其作用是保证该字段不能为空。前面在查看 student 表结构的时候,表头中有一列名为 Null,该列注明了字段是否添加了非空约束。 我们把讲 3NF 的时候的专业信息表创建出来,并用列级约束的形式设置专业字段为非空。其 SQL 语句如下:

create table specialty(
specialty_name varchar(20) not null,
specialty_college varchar(20)
);

输出结果:
在这里插入图片描述

使用 desc ,查看表结构:

desc specialty;

输出结果:
在这里插入图片描述

在我们插入数据的时候,如果该字段值为空就会出错,如下所示:

insert into specialty values(null,'计算机学院');

输出结果:
在这里插入图片描述

这里需要注意一点的是空值(NULL)与空字符串(‘’)的区别。

  • 查询判定的方式不同:判定某值是否为 null,可以使用 is null 或者 is not null ;而判定某值是否空字符串,使用 =、<> 来运算。
  • 是否参与运算:空值(NULL)是不参与运算的,而空字符串可以。
  • 是否占用空间:空值(NULL)是占用空间的,而空字符串(‘’)是不占用空间的。所以在设计表时,我们的字段尽可能的设置为 not null 约束。

主键约束

创建主键约束使用 PRIMARY KEY 语句,其作用是保证该字段的值具有唯一性。每张表只能创建一个主键,是该表的唯一标识,且默认自带非空属性。 利用修改表的方式,创建主键约束。修改 student 表,使 student_id 成为主键,具体实现 SQL 语句如下:

alter table student modify student_id int primary key;

输出结果:
在这里插入图片描述

采取 desc 命令查看表结构,Key 这一列出现 PRI 即设置成功。

desc student;

输出结果:
在这里插入图片描述

主键设置成功后,插入数据就要考虑它的唯一性和非空性。当前表中的记录有:

select * from student;

输出结果:

在这里插入图片描述

当插入新记录的 student_id 为 1,会给出错误提示,如下所示:

insert into student values(1,'小刘','大数据专业');

输出结果:
在这里插入图片描述

主键不能重复,需要我们在插入数据的时候知道待插入记录的主键是否已经存在。数据少且有序比较好确认;可如果数据多且乱序,确认主键重复的问题就会变得很麻烦。

有没有办法在我们插入记录的时候,让主键自动保持唯一性呢?

答案就是使用自增序列(auto_increment),一张表有且只能有一个自增序列。自增序列一般和主键搭配使用,使用自增序列字段的类型为整型。

修改 student 表的主键,使 student_id 具有自增属性。使用 drop 语句删除已经存在的主键特性,其实现 SQL 语句如下:

alter table student drop primary key;

输出结果:
在这里插入图片描述

再次设置 student_id 为主键,且具有自增属性。其 SQL 语句如下:

alter table student modify student_id int primary key auto_increment;

输出结果:
在这里插入图片描述

使用自增长的好处是,我们不用担心主键会重复的问题。需要注意,在插入数据的时候,自增长字段的值使用 null 来代替,如下所示:

insert into student values(null,'小赵','计算机专业');

输出结果:
在这里插入图片描述

查询结果:

select * from student;

输出结果:
在这里插入图片描述

默认值约束

创建默认值约束使用的语句是 DEFAULT,其作用保证该字段总会有值。设置所有学生的专业默认是大数据专业,其 SQL 语句如下:

alter table student modify student_specialty varchar(20) default '大数据专业';

输出结果:
在这里插入图片描述

下列语句不给 student_specialty 字段指定值:

insert into student(student_id,student_name) values(null,'小蓝');

因为默认值约束的存在,所以即便不给 student_specialty 字段指定值,系统也会自动插入默认值。查看插入后的结果如下:

select * from student;

输出结果:
在这里插入图片描述

唯一约束

创建唯一约束使用的语句是 UNIQUE,其作用保证字段值的唯一性。唯一约束和主键约束的相同点都是保证值的唯一性。区别在于,唯一约束在一张表中允许出现多个,而主键约束只能有一个。 给满足 3NF 的专业信息表中的专业名称字段创建唯一约束,使用表级约束的方法,创建的 SQL 语句如下:

create table specialty(
specialty_name varchar(20),
specialty_college varchar(20),
unique(specialty_name)
);
insert into specialty
values
('大数据专业','计算机学院'),
('计算机专业','计算机学院');

采取 desc 命令查看表结构,Key 这一列出现 UNI 即设置成功。

desc specialty;

输出结果:
在这里插入图片描述

使用 desc 命令可以查看到 specialty_name 所在行 key 这一列显示 “UNI”,即表示唯一约束设置成功。

外键约束

创建外键约束使用的语句是 FOREIGN KEY,其作用为限制两个表的关系,保证表中该字段的值来自于关联表。外键约束必须使用表级约束的方式来定义。

将学生表中的 student_specialty 设置为外键,关联 specialty 表中的 specialty_name。其 SQL 语句如下:

alter table student add foreign key(student_specialty) references specialty(specialty_name);

输出结果:
在这里插入图片描述

关键字 references 连接关联的表。需要注意,主表在插入记录的时候,外键的值必须能在关联表的关联列中找到,否则插入信息失败。 现 specialty 表中有数据如下:

select * from specialty;

输出结果:
在这里插入图片描述

在 student 表中插入记录的时候,字段 student_specialty 的值只能是这两个其中之一,否则会报错,如下所示:

insert into student values(null,'小兰','管理专业');

输出结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁辰兴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值