约束的种类
主键约束 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无法区分唯一性,实际中可以再设一个非空就可以了