约束(constraint)
什么是约束?
在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性
常见的约束有哪些呢?
- 非空约束(not null):约束的字段不能为NULL
- 唯一约束(unique):约束的字段不能重复
- 主键约束(primary key):约束的字段不能为NULL,也不能重复
- 外键约束(foreign key):
- 检查约束(check):注意,Oracle数据库有check约束,但是MySQL没有,目前MySQL不支持该约束
not null用法
not null:只有列级约束 create table 表名( 字段名1 数据类型 not null, 字段名2 数据类型, 字段名3 数据类型, …… ); =========================================== drop table if exists t_student; create table t_student ( stuno bigint not null, //非空约束 name varchar(255) default xxx, sex char(1), classno varchar(255), birth char(10) );
unique用法
【列级约束】 create table t_student ( stuno bigint unique, //唯一约束 name varchar(255), sex char(1), classno varchar(255), birth char(10) );扩展:给两个或多个字段联合添加unique【表级约束】
create table t_student ( stuno bigint, name varchar(255), sex char(1), classno varchar(255), birth char(10), //代表的是,stuno和name相同时,才会执行效果 unique(stuno,name) );
primary key 主键约束
怎么给一张表添加主键约束?
主键约束的特点“不能为NULL,也不能重复 create table t_student ( stuno bigint primary key, name varchar(255), sex char(1), classno varchar(255), birth char(10), ); 注意:一张表的主键约束只能有一个
主键有什么作用?
- 表的设计三范式中有需求,第一范式就是要求任何一张表都应该有主键
- 主键的作用:主键值是这行记录在这张表当中的唯一标识(像身份证号码)
主键的分类
根据主键字段的字段数量划分
- 单一主键(推荐,常用)
- 复合主键(多个字段联合起来添加一个主键约束,不建议使用,因为主键违背三范式)
根据业务性质来划分
- 自然主键:主键值最好就是一个和业务没有任何关系的自然数
- 业务主键:(不推荐)主键值和系统业务挂钩,例如 拿着银行卡的卡号做主键,拿着身份证号码做主键。最好不要拿着和业务挂钩的字段作为主键。因为以后的业务一旦发生改变的时候,主键值可能也需要随之发生变化。但有时候实在没办法变化。
主键值递增
create table t_student (
stuno bigint primary key auto_increment, // stuno字段自动维护一个自增的数字,从1开始,以1递增
name varchar(255),
sex char(1) //最后一个不能有逗号
);
insert into t_student(name) values('a');
insert into t_student(name) values('b');
insert into t_student(name) values('c');
这样就不需要用户手动去提供主键值了
foreign key 外键约束
drop table if exists t_student; drop table if exists t_class; create table t_class( cno int primary key, cname varchar(255) ); create table t_student( stuno int primary key, stuname varchar(255), classno int, foreign key(classno) references t_class(cno) ); 先创父,再创子,先删子,再删父。 上述的,t_class为父,t_student为子,子引用父的值作为外键 使用外键约束的字段的值不能随便写,字段值必须来自某一张表的某个字段的数据
- 被外键引用的字段的值,不一定是主键,但至少有unique约束(唯一性)
要不然父表中的cno字段重复了的话,引用的那一行的数据,比如说cname是一班还是二班那就分不清了
- 外键值可以为NULL
- 子表中外键引用的字段的值,父表中这个字段一定要有这个值