MySQL数据库——约束

文章目录

前言

MySQL约束是用于在关系型数据库中定义和实施数据完整性规则的规范。它们定义了数据库表中数据的限制条件,确保数据的一致性和有效性。

今天我将为大家分享以下约束:

  1. 主键约束(primary key)
  2. 自增长约束(auto_incremnet)
  3. 非空约束(not null)
  4. 唯一性约束(unique)
  5. 默认约束(default)
  6. 零填充约束(zerofill)
  7. 外键约束(foreign key)

主键约束

MySQL主键约束是一种用于保证表中数据唯一性和完整性的约束类型。主键是一个或多个列的组合,用于标识表中的唯一记录。主键约束要满足以下条件:

  1. 唯一性:主键的值在整个表中必须是唯一的。任意两个记录都不能具有相同的主键值。

  2. 非空性:主键的值不能为空。每个记录都必须具有一个非空的主键值。

  3. 唯一标识:主键作为表中每个记录的唯一标识。它可以用来在表中查找、更新和删除记录。

当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。

创建主键

主键有两种形式,一种是单列主键,第二种是联合主键。

单列主键

MySQL中创建单列主键有两种方式:一种是在我们创建表的时候,在对应列的后面指定主键,另外一种就是我们在创建完列之后指定主键

在创建表的时候指定主键

sql 复制代码
create table student1(id int primary key,name varchar(20));

在创建列之后指定主键

sql 复制代码
create table student1(id int,name varchar(20),constraint pk1 primary key(id));

这里 contrain pk1 可以省略,这种是 primary key 的完整写法,pk1 是约束名,可以自定义。

联合主键

联合主键是指将表中的多个列共同当作主键,可以出现某个列相同,但不允许所有对应的列都相同,并且不能含有null。

创建联合主键只有一种方法:
create table 表名(列名1 类型,列名2 类型,列名3 类型,constraint pk2 primary key(列名1,列名2));

sql 复制代码
create table student1(id int,name varchar(20),constraint pk1 primary key(id,name));

当出现某一列重复的时候,可以插入数据,但是当联合主键的对应列都相同的时候就插入失败。

sql 复制代码
insert into studen1 values(1,'张三');
insert into studen1 values(1,'李四');
sql 复制代码
insert into student1 values(2,'王五');
insert into student1 values(2,'王五');

任何一列都不能出现null

sql 复制代码
insert into student1 values(3,null);

通过修改表结构来指定主键

我们可以在创建完成表之后再指定主键 alter table 表名 add primary key(列名);
alter table 表名 add primary key(列名1,列名2)

sql 复制代码
create table student1(id int,name varchar(20));
alter table student1 add primary key(id);
sql 复制代码
create table student1(id int,name varchar(20));
alter table student1 add primary key(id,name);

删除主键约束

当不想使用主键的时候,可以使用 alter table 表名 drop primary key; 删除主键。

删除主键的时候,不管你是单列主键还是联合主键都使用 alter table 表名 drop primary key;

自增主键约束

MySQL自增主键是一种特殊类型的主键约束,它使用自动递增的值为每个新插入的记录生成唯一的标识符。自增主键允许无需手动指定主键值即可向表中插入记录,并确保每个记录都具有唯一的标识符。

使用自增主键具有以下优点:

  1. 简化数据插入:无需手动指定主键值,数据库会自动为每个新插入的记录分配一个唯一的主键值。这简化了插入操作的编码工作,并减少了出现冲突的可能性。

  2. 唯一性保证:自增主键的值在表中是唯一的,避免了手动管理主键冲突的问题。

  3. 快速访问:自增主键的值按顺序递增,这有助于提高基于主键的查询和索引操作的性能。

自增主键的特点:

  • 默认情况下, auto_increment 的初始值是 1 ,每新增一条记录,字段值自动加 1
  • 一个表中只能有一个字段使用 auto_increment 约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
  • auto_increment 约束的字段必须具备 NOT NULL 属性。
  • auto_increment 约束的字段只能是整数类型( TINYINT 、 SMALLINT 、 INT 、 BIGINT 等。
  • auto_increment 约束字段的最大值受该字段的数据类型约束,如果达到上限, auto_increment 就会失效。

创建自增主键

因为自增主键是特殊的主键,所以主键和自增主键需要指定到同一列中。

create table 表名 (列名1 类型 primary key auto_increment,列名2 类型);

sql 复制代码
create table student1(id int primary key auto_increment,name varchar(20));


当某一列被设置为自增主键时,我们插入数据的时候,可以传入null,该列数据会被默认为从1开始的自增数据(在没有定义自增初值的时候)。

sql 复制代码
insert into student1 values(null,'张三');

为自增主键赋初值

我们可以指定自增数据从哪开始,为自增数据指定初值。

create table student1(id int primary key auto_increment,name varchar(20)) auto_increment=值;

sql 复制代码
create table student1(id int primary key auto_increment,name varchar(20)) auto_increment=100;
insert into student1 values(null,'张三');

在创建表之后为自增主键赋初值

alter table 表名 auto_increment=初始值;

sql 复制代码
create table student1(id int primary key auto_increment,name varchar(20));
alter table student1 auto_increment=100;
insert into student1 values(null,'张三');

delete 和 truncate 在删除后自增列的变化

  • delete 数据之后自动增长从断点开始
  • truncate 数据之后自动增长从默认起始值开始
sql 复制代码
insert into student1 values(null,'张三');
insert into student1 values(null,'李四');
delete from student1;
insert into student1 values(null,'王五');
sql 复制代码
truncate student1;
insert into student1 values(null,'李华');

非空约束

MySQL非空约束是一种用于确保表中某列不允许包含空值(NULL)的约束类型。非空约束要求在插入或更新数据时,该列必须包含有效的值。非空约束可以应用于单个列或多个列。

创建非空约束

MySQL创建非空约束有两种方式:第一种是我们在创建表的时候指定非空约束
create table 表名(列名1 类型 not null,列名2 类型); 第二种就是我们创建完成表之后指定非空约束 alter table 表名 modify 列名 类型 not null;

sql 复制代码
create table student1(id int not null,name varchar(20));
desc student1;
sql 复制代码
create table student1(id int,name varchar(20));
alter table student1 modify id int not null;
desc student1;
sql 复制代码
insert into student1 values(null,'张三');

删除非空约束

alter table 表名 modify 列名 类型;

sql 复制代码
alter table student1 modify id int;
desc student1;

唯一约束

MySQL唯一约束是一种用于确保表中某列或多列的数据是唯一的约束类型。唯一约束保证了列中的值都是互不相同的,但允许包含一个或多个空值(NULL)。

创建唯一约束

MySQL中创建唯一约束同样有两种方法:创建表时指定唯一约束:create table 表名(列名1 类型 unique,列名2 类型); 创建表之后指定唯一约束:alter table 表名 add constraint unique_pn unique(列名); 这里constraint 约束名 不省略,为后面的删除唯一约束做准备。

sql 复制代码
create table student1(id int constraint unique_pn unique,name varchar(20));
insert into student1 values(1,'张三');
insert into student1 values(1,'李四');
sql 复制代码
create table student1(id int,name varchar(20));
alter table student1 add constraint unique_pn unique(id);
insert into student1 values(1,'张三');
insert into student1 values(1,'李四');

删除唯一性约束

删除唯一性约束的时候需要用到我们前面定义的约束名。
alter table 表名 drop index 唯一约束名

sql 复制代码
alter table student1 drop index unique_pn;

如果你前面没有定义唯一约束名,那么默认就是你设置唯一约束的列名。

默认约束

MySQL默认约束是在创建表时,为表中的某个列定义的一个默认值规则。当插入新的记录时,如果未显式提供该列的值,MySQL会自动将默认值应用于该列。默认约束可以是一个具体的值,也可以是一个表达式、函数或系统变量。

创建默认约束

我们MySQL默认的默认约束是null,那么我们也可以自己设置默认值。在创建表的同时指定默认约束: create table 表名(id int default 默认值,name varchar(20) default 默认值); 在创建表之后指定默认约束 alter table 表名 modify 列名 default 默认值;

sql 复制代码
create table student1(id int,name varchar(20) default '无名氏');
desc student1;
sql 复制代码
alter table student1 modify name default '无名氏';

删除默认约束(改为null为默认值)

alter table 表名 类型 modify 列名 default null;

sql 复制代码
alter table student1 varchar(20) modify name default null;

零填充约束

MySQL零填充约束是一种用于整型数据列的约束,它定义了在插入或更新数据时如何处理数值长度不足的情况。当一个整型数据列的数值长度小于定义的长度时,MySQL会使用零填充方式来补足。

  • 插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的 0
  • zerofill 默认为 int(10)
  • 当使用 zerofill 时,默认会自动加 unsigned (无符号)属性,使用 unsigned 属性后,数值范围是原值的 2 倍,例如,有符号为 -128 ~ +127 ,无符号为 0 ~ 256

创建零填充约束

create table 表名(列名1 类型(指定宽度) zerofill,列名2 类型);

sql 复制代码
create table student1(id int(5) zerofill,name varchar(20));
insert into student1 values(1,'张三')

删除零填充约束

alter table 表名 modify 列名 类型;

sql 复制代码
alter table student1 modify id int;
insert into student1 values(2,'李四');

零填充约束只是显示的时候是用0填充的,但是加上表中的内容没有变化。

外键约束

在学校中,我们都知道每个学生都有对应的班级,同样在MySQL中也可以将这种类似的关系体现出来。

外键用于关联其他表的主键或唯一键

创建外键约束

sql 复制代码
create table 表名 (列名 类型 foreign key (列名) references 另一个表名(关联的列名));
sql 复制代码
create table class (classId int primary key auto_increment,name varchar(20));
create table student (studentId int primary key auto_increment,name varchar(20),classId int,
     foreign key (classId) references class(classId));
desc student;

既然是学生,那么肯定要先有班级然后学生才能进入班级,并且学生不能进入不存在的班级。

sql 复制代码
insert into class (null,'高三1班');
insert into class values (null,'高三2班');
insert into class values (null,'高三3班');
insert into student values (null,'张三',1);
insert into student values (null,'李四',4);


删除外键约束

当插入的数据在外键对应的列中不含有时,就会报错。并且在以上的外键关系中,class为父表,student为子表,子表的插入和删除都受到父表的约束,同时父表的删除也受到子表的约束。

sql 复制代码
update student set classId = 5;
delete from class where classId = 1;

子表的修改,对应的列修改后的数据还是需要在父表中存在。父表删除的时候,如果子表与其有关联,那么就删除不了,只能先删除掉子表的对应行,然后再删除父表。

相关推荐
.Shu.1 小时前
Mysql InnoDB 底层架构设计、功能、原理、源码系列合集【五、InnoDB 高阶机制与实战调优】
数据库·mysql
新法国菜2 小时前
MySql知识梳理之DDL语句
数据库·mysql
DarkAthena3 小时前
【GaussDB】全密态等值查询功能测试及全密态技术介绍
数据库·gaussdb
ShawnLeiLei4 小时前
2.3 Flink的核心概念解析
数据库·python·flink
石皮幼鸟4 小时前
数据完整性在所有场景下都很重要吗?
数据库·后端
大只鹅5 小时前
Centos7.9 Docker26容器化部署 MySql9.4 一主一从的同步复制部署
mysql·centos
叁沐6 小时前
MySQL 28 读写分离有哪些坑?
mysql
nightunderblackcat6 小时前
新手向:异步编程入门asyncio最佳实践
前端·数据库·python
DarkAthena6 小时前
【GaussDB】使用MySQL客户端连接到GaussDB的M-Compatibility数据库
数据库·mysql·gaussdb
livemetee7 小时前
Flink2.0学习笔记:使用HikariCP 自定义sink实现数据库连接池化
大数据·数据库·笔记·学习·flink