约束的种类
- 主键约束 primary key
这个字段的值必须满足非空且该字段的值不能重复
一张表中只能有一个主键
- 唯一性约束 unique
这个字段的值不能重复
一张表中的唯一性约束个数不受限制
不能检查NULL值
- 非空约束 not null
这个字段的值不能是NULL值
一张表中的非空约束个数不受限
- 检查约束 check(条件)
字段的值必须符合检查条件(条件由自己指定,where里写的这里都可以写)
- 外键约束 references(参考/ 关联/ 引用)
建立两张表的关联关系
foreign key(外键) 指定字段
on delete cascade 级联删除
on delete set nill 级联置空
约束的实现
- 列级约束
在建立表时,直接在表的某一列之后加约束限制
- 表级约束
在建立(定义)完表的所有列之后,再选择某些列加约束限制
主键的列级约束实现
create table testcolumn_cons(id primary key, name varchar2(30));
insert into testcolumn_cons values(1, 'test1');
出错:00001,唯一性错误
如果不给约束起名字,则系统会自动为约束建立一个唯一的名字(但该名字比较难以理解)
如何给约束起名字(出错判断时,知道是哪一个出错了)
constraint(关键字) 约束名(表名_加约束的字段名_约束类型)
create table testcolumn_cons(id number constraint testcolumn_cons_idpl primary key, name varchar2(30));
这样出错时就知道是哪里出了错(起名要有规律)
主键的列级约束
演示:
- 建立一张表,建立之前先删表
- 这张表有id number是主键
- fname varchar2(30) 要求非空
- sname varchar2(30) 要求唯一
- 要求给约束起名字
drop table testcolunm_cons;
create table testcolumn_cons( id number constraint testcolumn_cons_id_pk primary key, fname varchar2(30) constraint testcolumn_cons_fname_nn not null, sname varchar2(30) constraint testcolumn_cons_sname_un unique );
查看:
desc table testcolumn_cons;
增加检查约束:salary number 检查条件:要求工资大于3500。
create table testcolumn_cons(id number constraint testcolumn_cons_id_pk primary key, fname varchar2(30) constraint testcolumn_cons_fname_nn not null, sname varchar2(30) constraint testcolumn_cons_sname_un unique, salary number constraint testcolumn_cons_salary_ck check(salary>3500)
);
检测一下:
insert into testcolumn_cons values(1, 'a', 'b', 3499);
主键的表级约束
- 在约束关键字后面(要约束的字段名),非空不让有表级约束。
- 定义完所有的字段和类型后,加“,”再加上表级约束。
演示:
- 建立一张表 建立之前先删表
- 这张表有id number 是主键
- fname varchar2(30)
- sname varchar2(30) 要求唯一
- salary number 要求工资大于3500
- 要求给约束起名字
- 增加约束,检查约束
create table testtable_cons( id number, fname varchar2(30), sname varchar2(30), salary number, constraint testtable_cons_id_pk primary key(id), constraint testtable_cons_sname_un unique(sname), constraint testtable_cons_salary_ck check(salary>3500), );
not null 没有表级约束
联合约束
在表级约束时,指定约束的字段时,可以约束多个字段
没有“联合非空”的说法,所以非空没有表级约束
演示:拿上面的例子再做一次,把id和fname绑成一个主键——联合主键(理论绑多个)
把id和fname联合起来非空且唯一
这样是只有一个主键的!id+fname是主键
id fname
1 a
1 b
1 NULL
都可以,id重复了也没关系,因为主键是联合的;
fname是NULL也没关系,联合的不为空就行。
create table testtable_cons( id number, fname varchar2(30), sname varchar2(30), salary number, constraint testtable_cons_id_pk primary key(id), constraint testtable_cons_sname_un unique(sname), constraint testtable_cons_salary_ck check(salary>3500), );
表级约束 vs 列级约束
- 表级约束:可以做联合约束
- 列级约束:书写简单直观,无法完成联合约束
实际应用中混着用
唯一性(unique)只能区分非空值,不可以区分空值(NULL)
两个或多个NULL无法区分唯一性,实际中可以再设一个非空就可以了