(1)定义约束
![82da651e985b5072930eff34765cd8a9.png](https://i-blog.csdnimg.cn/blog_migrate/a4e1ec2c0974d3b046d315aac8030aa9.jpeg)
(2)列级约束表级约束
![177e3d05c07822eba3d33fb7ac5493ac.png](https://i-blog.csdnimg.cn/blog_migrate/f0638db66b6cd32d7fe4014a15a993fa.jpeg)
(3)非空约束 NOT NULL
非空约束作用的列也叫强制列。顾名思义,强制列中必须有值,当然建表时候若使用default关键字指定了默认值,则可不输入。
![b428b4c7f446b117ca04448d7a1de97f.png](https://i-blog.csdnimg.cn/blog_migrate/a727fb4a86e69a38df34acc000976d36.jpeg)
(4)唯一性约束unique
唯一性约束可作用在单列或多列上,对于这些列或组合,唯一性约束保证每一行的唯一性。
Unique需要注意:对于unique约束来讲,索引是必须的。如果不存在,就自动创建一个(unique的唯一本质上是通过索引来保证的)
Unique允许null值,unique约束的列可存在多个null。这是因为,unique唯一性通过btree索引来实现,而btree索引中不包含null。当然,这也造成了在where语句中null值进行过滤会造成全表扫描。
![33f01caee8ba7907c57503cd87a9b706.png](https://i-blog.csdnimg.cn/blog_migrate/5cae6a0df93b0ace496f5505862a0c09.jpeg)
(5)主键约束 primary key
主键是定位表中单个行的方式,可唯一确定表中的某一行,关系型数据库要求所有表都应该有主键,不过Oracle没有遵循次范例要求,Oracle中的表可以没有主键(这种情况不多见)。关于主键有几个需要注意的点:
键列必须具有唯一性,且不能为空,其实主键约束相当于unique+not null 一个表只允许有一个主键
主键所在列必须具有索引(主键的唯一约束通过索引来实现),如果不存在,将会在索引添加的时候自动创建
注意:主键约束可以定义在表级也可以定义在列级(添加主键:约束的添加可在建表时创建,也可如下所示在建表后添加,一般推荐建表后添加,灵活度更高一些,建表时添加某些约束会有限制)
![398057cc4556caf4274c0aee00e89754.png](https://i-blog.csdnimg.cn/blog_migrate/a830cf77aa6e8e2d1b552db18b6d5486.jpeg)
(6)外键约束 foreign key
外键约束定义在具有父子关系的子表中,外键约束使得子表中的列对应父表的主键列,用以维护数据库的完整性。不过出于性能和后期的业务系统的扩展的考虑,很多时候,外键约束仅出现在数据库的设计中,实际会放在业务程序中进行处理。外键约束注意以下几点:
外键约束的子表中的列和对应父表中的列数据类型必须相同,列名可以不同
对应的父表列必须存在主键约束(Primary key)或唯一约束(unique)
外键约束允许null值,对应的行就成了孤行了
其实很多时候不使用外键,很多人认为会让删除操作比较麻烦,比如要删除父表中的某条数据,但某个子表中又有对该条数据的引用,这时就会导致删除失败。我们有两种方式来优化这种场景:
第一种方式简单粗暴,删除的时候,级联删除掉子表中的所有匹配行,在创建外键时,通过 on delete cascade 子句指定该外键列可级联删除:
alter table emp add constraint emp_deptno_fk foreign key(deptno) references dept(deptno)on delete cascade;
第二种方式,删除父表中的对应行,会将对应子表中的所有匹配行的外键约束列置为null,通过on delete set null子句实施:
alter table emp add constraint emp_deptno_fk foreign key(deptno) references dept(deptno) on delete set null;
实际上,外键约束列和对应的父表列可以在同一张表中,常见的就是表的业务逻辑含义是一棵树,最简单的例子如下(id为主键id,fid为父id,fid存储对id的引用),这种结构的表根据业务要求可通过Oracle的递归查询来获取这种层级关系
![34ab16022c07f72dcefdf6c653612b01.png](https://i-blog.csdnimg.cn/blog_migrate/772b6b6890a215e7b819d5f2c8206f69.jpeg)
注意:外键约束可以定义在表级也可以定义在列级
foreign key:在表级指定子表中的列
references:标示在父表中的列
no delete cascade(级联删除):当父表中的列被删除时,字表中相对应的列也被删除
no delete set null(级联置空):子表中相应的列置空
![abe0f3845b9eff803a39286c0115f5b2.png](https://i-blog.csdnimg.cn/blog_migrate/2ea31bc39454bf03f266700dcd1688f1.jpeg)
![4dcd77ee0efbc618e8fbf29bdcd8b102.png](https://i-blog.csdnimg.cn/blog_migrate/c27cd42b35e9b59ec3c4bc40670bce27.jpeg)
(7)检查约束 check 约束
检查约束可用来实施一些简单的规则,比如列值必须在某个范围内。检查的规则必须是一个结果为true或false 的表达式,比如:
![304c7463e43abe4c1e5d1794b4a94b94.png](https://i-blog.csdnimg.cn/blog_migrate/2b2047e656f34a7d0f063109adf9d389.jpeg)
alter table emp add constraint emp_sex_ck check(sex in('男','女'));
alter table test31 add constraint chkk check (sex ='男' or sex='女');
alter table test34 add constraint ch_test34 check(age>0 and age<120);
alter table test34 add constraint ch_test34 check(age between 12 and 30); --在一个范围中间
alter table test36 add constraint ch_test36 check(length(password)=6); --长度大于某个值
alter table test36 add constraint email check (email like '%@%'); --电子邮箱要含有@符号
alter table test36 add constraint password check((password like '00[0-9][0-9]/_[a-z,A-Z][a-z,A-Z][a-z,A-Z]%' escape '/')and(length(password)=8) )
这是本人博客链接:https://xfzcql21.blog.csdn.net/