前言
MySQL约束是用于在关系型数据库中定义和实施数据完整性规则的规范。它们定义了数据库表中数据的限制条件,确保数据的一致性和有效性。
今天我将为大家分享以下约束:
- 主键约束(primary key)
- 自增长约束(auto_incremnet)
- 非空约束(not null)
- 唯一性约束(unique)
- 默认约束(default)
- 零填充约束(zerofill)
- 外键约束(foreign key)
主键约束
MySQL主键约束是一种用于保证表中数据唯一性和完整性的约束类型。主键是一个或多个列的组合,用于标识表中的唯一记录。主键约束要满足以下条件:
- 唯一性:主键的值在整个表中必须是唯一的。任意两个记录都不能具有相同的主键值。
- 非空性:主键的值不能为空。每个记录都必须具有一个非空的主键值。
- 唯一标识:主键作为表中每个记录的唯一标识。它可以用来在表中查找、更新和删除记录。
当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
创建主键
主键有两种形式,一种是单列主键,第二种是联合主键。
单列主键
MySQL中创建单列主键有两种方式:一种是在我们创建表的时候,在对应列的后面指定主键,另外一种就是我们在创建完列之后指定主键
在创建表的时候指定主键
create table student1(id int primary key,name varchar(20));
在创建列之后指定主键
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));
create table student1(id int,name varchar(20),constraint pk1 primary key(id,name));
当出现某一列重复的时候,可以插入数据,但是当联合主键的对应列都相同的时候就插入失败。
insert into studen1 values(1,'张三'); insert into studen1 values(1,'李四');
insert into student1 values(2,'王五'); insert into student1 values(2,'王五');
任何一列都不能出现null
insert into student1 values(3,null);
通过修改表结构来指定主键
我们可以在创建完成表之后再指定主键 alter table 表名 add primary key(列名);
alter table 表名 add primary key(列名1,列名2)
create table student1(id int,name varchar(20)); alter table student1 add primary key(id);
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自增主键是一种特殊类型的主键约束,它使用自动递增的值为每个新插入的记录生成唯一的标识符。自增主键允许无需手动指定主键值即可向表中插入记录,并确保每个记录都具有唯一的标识符。
使用自增主键具有以下优点:
- 简化数据插入:无需手动指定主键值,数据库会自动为每个新插入的记录分配一个唯一的主键值。这简化了插入操作的编码工作,并减少了出现冲突的可能性。
- 唯一性保证:自增主键的值在表中是唯一的,避免了手动管理主键冲突的问题。
- 快速访问:自增主键的值按顺序递增,这有助于提高基于主键的查询和索引操作的性能。
自增主键的特点:
- 默认情况下, 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 类型);
create table student1(id int primary key auto_increment,name varchar(20));
当某一列被设置为自增主键时,我们插入数据的时候,可以传入null,该列数据会被默认为从1开始的自增数据(在没有定义自增初值的时候)。
insert into student1 values(null,'张三');
为自增主键赋初值
我们可以指定自增数据从哪开始,为自增数据指定初值。
create table student1(id int primary key auto_increment,name varchar(20)) auto_increment=值;
create table student1(id int primary key auto_increment,name varchar(20)) auto_increment=100; insert into student1 values(null,'张三');
在创建表之后为自增主键赋初值
alter table 表名 auto_increment=初始值;
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 数据之后自动增长从默认起始值开始
insert into student1 values(null,'张三'); insert into student1 values(null,'李四'); delete from student1; insert into student1 values(null,'王五');
truncate student1; insert into student1 values(null,'李华');
非空约束
MySQL非空约束是一种用于确保表中某列不允许包含空值(NULL)的约束类型。非空约束要求在插入或更新数据时,该列必须包含有效的值。非空约束可以应用于单个列或多个列。
创建非空约束
MySQL创建非空约束有两种方式:第一种是我们在创建表的时候指定非空约束
create table 表名(列名1 类型 not null,列名2 类型);
第二种就是我们创建完成表之后指定非空约束 alter table 表名 modify 列名 类型 not null;
create table student1(id int not null,name varchar(20)); desc student1;
create table student1(id int,name varchar(20)); alter table student1 modify id int not null; desc student1;
insert into student1 values(null,'张三');
删除非空约束
alter table 表名 modify 列名 类型;
alter table student1 modify id int; desc student1;
唯一约束
MySQL唯一约束是一种用于确保表中某列或多列的数据是唯一的约束类型。唯一约束保证了列中的值都是互不相同的,但允许包含一个或多个空值(NULL)。
创建唯一约束
MySQL中创建唯一约束同样有两种方法:创建表时指定唯一约束:create table 表名(列名1 类型unique,列名2 类型); 创建表之后指定唯一约束:alter table 表名 add constraint unique_pn unique(列名); 这里constraint 约束名 不省略,为后面的删除唯一约束做准备。
create table student1(id int constraint unique_pn unique,name varchar(20)); insert into student1 values(1,'张三'); insert into student1 values(1,'李四');
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 唯一约束名
alter table student1 drop index unique_pn;
如果你前面没有定义唯一约束名,那么默认就是你设置唯一约束的列名。
默认约束
MySQL默认约束是在创建表时,为表中的某个列定义的一个默认值规则。当插入新的记录时,如果未显式提供该列的值,MySQL会自动将默认值应用于该列。默认约束可以是一个具体的值,也可以是一个表达式、函数或系统变量。
创建默认约束
我们MySQL默认的默认约束是null,那么我们也可以自己设置默认值。在创建表的同时指定默认约束: create table 表名(id int default 默认值,name varchar(20) default 默认值); 在创建表之后指定默认约束 alter table 表名 modify 列名 default 默认值;
create table student1(id int,name varchar(20) default '无名氏'); desc student1;
alter table student1 modify name default '无名氏';
删除默认约束(改为null为默认值)
alter table 表名 类型 modify 列名 default null;
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 类型);
create table student1(id int(5) zerofill,name varchar(20)); insert into student1 values(1,'张三')
删除零填充约束
alter table 表名 modify 列名 类型;
alter table student1 modify id int; insert into student1 values(2,'李四');
零填充约束只是显示的时候是用0填充的,但是加上表中的内容没有变化。
外键约束
在学校中,我们都知道每个学生都有对应的班级,同样在MySQL中也可以将这种类似的关系体现出来。
外键用于关联其他表的主键或唯一键
创建外键约束
create table 表名 (列名 类型 foreign key (列名) references 另一个表名(关联的列名));
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;
既然是学生,那么肯定要先有班级然后学生才能进入班级,并且学生不能进入不存在的班级。
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为子表,子表的插入和删除都受到父表的约束,同时父表的删除也受到子表的约束。
update student set classId = 5; delete from class where classId = 1;
子表的修改,对应的列修改后的数据还是需要在父表中存在。父表删除的时候,如果子表与其有关联,那么就删除不了,只能先删除掉子表的对应行,然后再删除父表。