1、约束
1.1、什么是约束?
在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。
1.2、常见的约束有哪些?
- 非空约束(not null):约束的字段不能为 null
- 唯一约束(unique):约束的字段不能重复
- 主键约束(primary key):约束的字段既不能为 null,也不能重复 (简称PK)
- 外键约束(foreign key)
- 检查约束(check):注意Oracle数据库有check约束,但是MySQL没有。
2、非空约束(not null)
约束的字段不能为null,如果为空会报语法错误。
例如:创建 表 t_user,name字段添加非空约束
create table t_user(
id int,
name varchar(255) not null,
password varchar(255)
);
在这个表进行插入时,name字段不能为null,一定要进行赋值。
正确插入:
insert into t_user(id, name, password) values(1, 'zhangsan', '123');
错误插入:(报语法错误)
insert into t_user(id, password) values(1, '123');
3、唯一性约束(unique)
约束的字段不能重复,但可以为 null
3.1、指定某个字段唯一性约束
例如:创建 表 t_user,name字段添加唯一性约束
create table t_user(
id int,
name varchar(255) unique,
password varchar(255)
);
在这个表进行插入时,name字段不能重复。
3.2、指定多个字段联合在一起的唯一性约束
create table t_user(
id int,
name varchar(255),
password varchar(255) ,
unique(name, password)
);
以上表示,name字段单独可以重复,password字段单独也可以重复,但他们两个联合起来不能重复。
4、主键约束
约束的字段既不能为 null,也不能重复
主键约束的相关术语:
- 主键约束:
primary key
- 主键字段:添加主键约束的那个字段
- 主键值:主键字段的值
注意:一张表的主键约束只能有一个!!
列级约束方式:在字段的数据类型后面直接加约束,如id int primarykey,
表级约束方式:在最后添加约束,如primary key(字段名)
4.1、创建表,并添加主键约束
例如:创建 表 t_user,id字段添加主键约束(列级约束方式)
create table t_user(
id int primary key,
name varchar(255),
email varchar(255)
);
id字段既不能为空(null),也不能重复。
4.2、主键的作用
- 表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键;
- 主键的作用:主键值是这行记录在这张表的唯一标识。(就像一个人的身份证一样)
4.3、主键的分类
- 按主键的字段的字段数量划分:
单一主键:(推荐,常用)
复合主键:(多个字段联合起来添加一个主键约束)(不建议使用) - 根据主键性质来划分:
自然主键:(主键和业务没有任何关系的自然数)(推荐使用)
业务主键:(主键值和系统的业务挂钩)(不推荐使用)
4.4、主键自增 : auto_increment
自增默认是从1开始的
例如:
create table t_user(
id int default 10 primary key auto_increment,
name varchar(255),
email varchar(255)
);
5、外键约束
关于外键约束的相关术语:
- 外键约束:foreign key
- 外键字段:添加外键约束的字段
- 外键值:外键字段的值
为了防止所有信息在一张表中冗余,需要将一张表的数据分成两张表进行存储,但表1与表2之间存在引用关系,例如表2需要引用表1中的字段信息,这时候就需要添加外键约束。
- 父表:如上面所说的表1。被其他表所引用的称为父表
- 子表:如上面所说的表2。引用其他表的称为子表
5.1、使用外键约束创建表
- 父表:
create table t_class(
cno int,
cname varchar(255),
primary key(cno)
);
- 子表
create table t_student(
sno int,
sname varchar(255),
classno int,
foreign key(classno) references t_class(cno)
);
注意:创建的时候,先创建父表,再创建子表;删除的时候,先删除子表,再删除父表。
外键是可以为null的。被外键引用的字段不定义是主键,但至少具有unique约束