在MySQL数据库中,约束(Constraint)是用于限制表中数据的一种规则,目的是为了确保数据的完整性以及一致性。下面我们就从建表时的约束、建表后如何添加约束等几个方面,讲解MySQL中常用的几种约束。
创建时约束
分类
非空约束
非空:关键字为[not null]。用来约束数据的该字段不能设置空值,也就是说,这一列的每个数据都应该有值。
非空约束的特点:
①插入数据时必须给该字段设置值
②修改数据时不能将字段修改为null
create table tbname{
id int not null,
-- other
};
唯一约束
唯一:关键字为[unique]。用来约束数据的该字段不因该有重复的值,也就是说,这一列的每个数据都是不一样的。
唯一约束的特点:
①插入数据时,如果设置值,那么不能与该列其它数据一样否则失败。如果不设置值,那么可以为null,如果该列有多个null值,不违反唯一约束(都没有值,怎么判断它们相等呢,是吧)
②修改数据时,如果将null修改为具体的值,那么这个值不能与该列其它数据一致
create table tbname{
id int unique,
-- other
};
主键约束
主键:关键字为[primary key]。是唯一标识 表中每一行的 那一列字段的约束。
主键的三个要求:
①每个数据表都应该有一个唯一的主键
②主键不应该被频繁的修改
③为了满足条件二,主键该与业务无关,避免业务的改变带动主键频繁修改。
主键的三个特点:
①唯一性:主键一旦设置,就自动加上了唯一约束
②非空性:主键一旦设置,就自动加上了非空约束
③单一性:即主键最多只能有一个,如果想要有多个字段都作为标识,那么可以使用联合主键的方式将多个字段联合为一个主键。
主键约束中常常与自增约束搭配使用:
自增约束的关键字为:[auto_increment],即每次插入一条新的数据,无需赋值,就可以根据内部的计数器的值设置主键的值。
create table tbname{
id int primary key auto_increment,
-- other
};
默认约束
默认:关键字为[default]。是用来约束该字段不设值时,默认给的一个值。如果不约束则是默认null。
默认约束的特点:
就是在插入数据时,如果不插入该字段,该字段的值会根据默认约束的默认值填充。
外键约束
外键:关键字为[foreign key]。外键用于建立表与表之间的关系,确保在一个表中的某列值必须在另一个表中出现。
外键的使用:
create table tbname{
id int primary key auto_increment,
userid int foreign key references usertb(id)
};
拥有外键的表称之为子表(从表),外键关联的表称之为父表(主表)。
子表中拥有外键约束的字段,引用(references)父表中的主键或者唯一键。外键约束确保子表中的每个外键值都在父表中有对应的值。
外键约束的类型:
cascade:如果父表删除行,则所有引用该行的子表行也会被自动删除
set null:如果父表删除行,则所有引用该行的子表行会被设置为NULL
set default:如果父表删除行,则所有引用该行的子表行会被设置为默认值
no action:如果试图删除父表的行而子表中仍有引用,将会抛异常,阻止删除
restrict:与no action相似,但是在删除或更新时,立即检查外键约束,而不是在事务结束时检查
外键使用的注意事项:
①子表的外键约束列的数据类型必须与父表的引用列的数据类型相同
②外键约束会影响增删改,确保外籍值的有效性会导致性能下降
如果子表插入的外键值为空,可以建立,在该表中称为孤儿数据
先建父表,再建子表。
先插入父表数据,再插入子表数据
先删除子表数据,再删除父表数据
先删子表,在删父表
检查约束
检查:关键字为[check]。检查约束是用来确保列中的值符合特定的条件的一种规则。
检查约束的使用:
create table tbname{
id int primary key auto_increment,
salary decimal check(salary >= 0)
};
应用
create table mytb(
id int not null, #非空约束
name varchar(20) #不设置就是可以为空
);
insert into mytb(name) values("stark");#err-id is not null
insert into mytb(id,name) values(1,"stark");#sucess
#创建时约束
create table mytb(
id int not null default 123,
name varchar(20)
);
insert into mytb(name) values("stark");#sucess-id默认为123 -is not null
#创建时约束
create table mytb(
id int unique,
nama varchar(20)
);
insert into mytb(id) values(1);#sucess
insert into mytb(id) values(1);#err-上面一条语句已经插入了一个id值为1的记录了
创建后约束
非空约束
#创建后约束
alter table mytb
modify name varchar(20) not null;
#删除约束
alter table mytb
modify name varchar(20) null;
默认约束
#创建后约束
alter table mytb
modify name varchar(20) default "";
#删除约束
alter table mytb
modify name varchar(20) default null;
根据上面的例子,我们呢大概率也清楚了大概的方法,在使用时可以不断地尝试。
表级约束 - 联合主键(键、索引)
#创建时约束:
create table mytb(
id int,
name varchar(20)
[constraint id_name] unique(id, name)
);#[constraint 是为键key or 索引index起别名]
#创建后约束:
alter table mytb
add [constraint id_name] unique(id,name);
#删除:
alter table mytb
drop key id_name;
alter table mytb
drop index id_name;