什么是约束:约束:就是约定哪些东西能填、怎么填?哪些东西不能填?
文章目录
- 前言:建表
- 正文
- 一、实体完整性约束
- 1. 主键约束
- 2. 唯一性约束
- 3. 自增长约束
- 4. 联合主键约束
- 二、域完整性约束
- 三、引用完整性约束
- 1. 外键约束
讲约束一般是在创建表时,对字段名进行约束,所以这里先讲如何创建表:
前言:建表
语法:
create table 表名(
字段名1 数据类型 [约束],
字段名2 数据类型 [约束],
... -- 最后一个不写,逗号
);
正文
一、实体完整性约束
1. 主键约束
主键:所有字段中唯一标识的一个字段。特点:非空、唯一,一张表只能有一个主键
分类:
- 自然主键:使用表中的字段作为主键(比如:身份证号)
- 代理主键:自定义一个字段来作为主键(这个用的多,比如:id)
语法:主要是在上面创建表中的 [约束]
处使用:字段名 数据类型 primary key
2. 唯一性约束
这一列的数据值要唯一(比如注册的时候,用户名不重复,但是 null 不算重复)语法为:字段名 数据类型 unique;
3. 自增长约束
一般自增长加在主键上,语法:字段名 数据类型 primary key auto_increment
举例:
-- 假如插入的时候不写字段名怎么办?比如:
insert into user values('张三',30);
-- 那我们知道不写字段名时,所有都需要赋值,那id怎么赋值,id是自增长的,但是我又必须赋值,怎么办,直接赋 null。但主键不能为null,所以这里的null相当于就是占位的作用
4. 联合主键约束
由多个字段组成的主键。联合主键没有自增长。语法:primary key(字段名1,字段名2,...)
create table user(
name varchar(20),
age int,
primary key(name,age)
)
二、域完整性约束
域:就是表中的某一个单元格,对格子的约束。
1、非空约束:字段名 数据类型 not null
2、数据类型约束:类型要匹配
3、默认值约束:字段名 数据类型 default 默认值
。如果给了值,就用你的值,没有就是默认值
三、引用完整性约束
上面两种约束都是在单表中实现的,而现在多张表怎么办?
引用:一张表关联另一张表,两张表之间有引用关系。
1. 外键约束
实际开发中,如果能用逻辑外键(就是你认为这两张表有关系就行了),就不要添加外键约束。比如:
create table emp(
empno int primary key,
ename varchar(30),
job varchar(30),
salary double,
);
create table dept(
deptno int primary key,
dname varchar(30),
location varchar(30)
)
① 上面这两张表没有任何关系,那如何加关系?----> **外键:**在一个表中加字段指向另一个表的主键。如:在 emp 中加:deptno int
。
② 在实际开发中,这样写已经足够了。因为表虽然没有外键约束,但有关系了,这就叫做逻辑外键。
那外键约束怎么写呢?
create table emp( empno int primary key, ename varchar(30), job varchar(30), salary double, deptno int, constraint fk_emp_dept foreign key(deptno) references dept(deptno) )
fk_emp_dept
:就是外键约束的名字。随便命名,一般是前面加 fk,emp_dept 就是哪个表指向哪个表。
foreign key(deptno)
:deptno 参数,就是指定哪个字段当外键。
references dept(deptno)
:dept 是外键指向哪个表。括号里面的参数就是 dept 表中的主键。
外键约束需要注意:主表(外键指向的表叫做主表),从表(有外键的表叫做从表)
-
主表有的,从表可以没有;但从表有的,主表必须要有。
比如:添加(修改)数据
insert into dept (deptno,dname,location) values(10,'研发部','金融港'); -- 正常运行 insert into emp (empno,ename,job,salary,deptno) values(2023,'张三','java开发','20000',20); -- 报错
-
删除主表的时候,要保证从表中没有。
比如:删除
delete from dept where deptno = 10; -- 假如从表emp中有在部门10的员工,则删除失败,否则可以删除
这就是外键约束的原因,所以一般都是逻辑外键