约束
什么是约束?
约束对应的英语单词:counstraint
在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性,有效性。
约束的作用就是为了保证:表中的数据有效性。
约束包括那些
- 非空约束:not null
- 唯一性约束:unique
- 主键约束:primary key(简称PK)
- 外键约束:foreign key(简称FK)
- 检查约束: check(mysql不支持,oracle支持)
非空约束:not null
非空约束not null 约束的字段不能为null。
create table t_user(
id int,
name varchar(255) not null//not null只有列级约束,没有表级约束
);
唯一性约束:unique
唯一性约束unique约束的字段不能重复,但是可以为null,多个null不算重复。
create table t_user(
id int,
name varchar(255) unique
);
新需求:name和email两个字段联合起来具有唯一性!!!
create table t_user(
id int,
name varchar(255) unique,//约束直接添加在列后面,叫做列级约束
email varchar(255) unique
);
这张表这样创建是不符合我以上“新需求的”。
这样创建表示:name具有唯一性,email具有唯一性。各自唯一。
//正确创建方式
//该方式实现name重复email不重复,或者name不重复email重复
create table t_user(
id int,
name varchar(255),
email varchar(255),
unique(name,email)//约束没有添加在列的后面,这种约束称为表级约束。
);
not null 和unique联合使用
create table t_user(
id int,
name varchar(255) not null unique
);
注意:在mysql中如果一个字段同时被not null 和 unique约束的话,该字段自动变为主键字段。(在oracle中不一样)
mysql> desc t_user;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(255) | NO | PRI | NULL | |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.04 sec)
主键约束
什么是主键?有什么用?
主键值是每一行记录的唯一标识。
主键值是每一行记录的身份证。
主键的特征:not null + unique(主键值不能是null,同时也不能重复);
任何一张表都应该有主键,没有主键表无效!!!
一张表主键约束只能添加一个
create table t_user(
id int primary key,//列级约束
name varchar(255)
);
create table t_user(
id int ,
name varchar(255),
primary key(id)//表级约束
);
表级约束主要是给多个字段联合起来添加约束
create table t_user(
id int ,
name varchar(255),
email varchar(255),
primary key(id,name)//id和name联合起来添加约束:复合主键!!!
);
在实际开发中不建议使用:复合主键,建议使用单一主键,因为主键值存在的意义就是这行记录的身份证,只要意义达到即可,单一主键可以做到,复合主键比较复杂,不建议使用!!!
主键值建议使用:
-
int
-
bigint
-
char
等类型
不建议使用:varchar来做主键。主键值一般都是数字,一般都是定长的。
主键除了:单一主键和复合主键外,还可以怎样进行分类?
自然主键:主键值是一个自然数,和业务没有关系。
业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值,这就是业务主键。
在实际开发中使用业务主键多,还是使用自然主键多一些?
自然主键使用比较多,因为主键只要做到不重复就行,不需要实际意义。
业务主键不好,因为主键一旦和业务挂钩,要么当业务发生变动的时候,可能会影响到主键,所以主键不建议使用,尽量使用自然主键。
在mysql中,有一种机制,可以帮助无名自动维护一个主键值
create table t_user(
id int primary key auto_increment,//auto_increment表示自增,从1开始,以1递增
name varchar(255),
email varchar(255)
);
外键约束(foreign key ,简称PK)
业务背景:
请设计数据库表,来描述“班级和学生”的信息?
t_class是父表
t_student是子表
create table t_class(
classno int primary key,
classname varchar(255),
);
create table t_student(
no int primary key auto_incroement,
name varchar(255),
cno int,
foreign key(cno) references t_class(classno) //外键cno引用t_class表的classno字段
);
删除上面表的顺序?
先删除子表,再删除父表。
创建表的顺序?
先创建父表,再创建子表
删除数据的顺序?
先删除子表数据,再删除父表数据。
插入数据的顺序?
先插入父表,再插入子表。
思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?
不一定是主键,但至少具有unique约束
思考:外键可以为null吗?
外键值可以为null。