一、什么约束?常见的约束
保证表中数据的完整性,合法性,有效性
- 非空 not null 不能为null
- 唯一 unique 不能重复
- 主键 primary key 不能为null,也不能重复(简称 PK)
- 外键 foreign key (简称FK)
- 默认 default
-
1、非空约束 not null
被修饰的字段不能为null
- 只能列级约束,之能加在字段后面
```sql
Drop table if exists t_user
如果表存在把表删掉
Create table t_user (
); Insert into t_user(id,username) values(1,’zhangsan’); 报ERROR 1364 (HY000): Field ‘passwrod’ doesn’t have a default value 代号1364异常表示 该字段不能插入null。Id int primary key, #id为主键不能为空,不能重复,必须是int
username varchar(255) unique, #username 为唯一,不能重复
Password varchar(255) not null #passwrod非空,不能为null
<a name="BzySS"></a>
## 2、唯一约束 unique
<a name="dUR3y"></a>
##### 被修饰的字段不能重复,可以为null(多个null)
```sql
Create table t_user (
Id int primary key, #id为主键不能为空,不能重复,必须是int
username varchar(255) unique, #username 为唯一,不能重复
Password varchar(255) not null #passwrod非空,不能为null
);
插入username重复数据:
insert into t_user values(2,'zhangsan','v');
报错:ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'username'
1) 表级约束
给两个列或者多个列添加unique
Create table t_user(
Id int primary key,
Username varchar(255),
Usercode varchar(255),
Unique(username,usercode) #表示username和usercode联合起来唯一
)
上面这种方式,也就是说只有插入的数据 username 和 usercode 都相同时才会报错
2) 列级约束
Create table t_user(
Id int primary key,
Username varchar(255) Unique,
Usercode varchar(255) Unique
)
上面这种表示,分开唯一,并不是联合
3、主键约束
Create table t_user(
Id int primary key, #列级约束
Username varchar(255)
);
:::info
被主键约束的字段不能为null也不能重复
一张表的主键约束只能有一个
:::
主键的作用
这行记录的唯一标识
分类
根据主键字段的字段数量来划分
- 单一主键(常用)
- 复合主键
根据主键的性质来划分
- 自然主键:主键值最好就是一个和系统业务没有任何关系的自然数
业务主键:主键值和系统的业务挂钩,例如拿着银行卡的卡号做主键【不建议使用】
1) 使用表级约束定义主键
Drop table if exists t_user;
Create table t_user(
Id int,
Username varchar(255),
Password varchar(255)
Primary key(id)
);
2) 自增长列 auto_increment
Drop table if exists t_user ;
Create table t_user(
Id int primary key auto_increment, #自增长列
Username varchar(255)
);
4、外键约束foreign key
关于外键约束的相关术语
外键字段:foreign key
外键约束:被修饰的字段
外键值:字段里面的值
作用:如果一张表【student】引用了【class】的外键约束,那么student为子表,class为父表(父子关系)
t_student表中的classno字段引用t_class表中的cno字段,此时t_student叫做子表,t_class为父表
注意:
外键可以为null
- 主表的关联列必须是一个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(
Sno int primary key,
Sname varchar(255),
Classno int,
Foreign key (Classno) references t_class(Cno)
#外键约束,标识本表中的classno引用t_class表中的cno
);
----------------------------------------------------------
插入数据先插入父,再插入子
Insert into t_class values(101,'dingzhouyizhong')
Insert into t_student values(1,'zhangsan','101')