约束的概述:

约束是在表中定义的用于维护数据库完整性的一些规则

(1).主键约束

不能为空也不能重复

在一个表中只能定义一个主键约束

Oracle会在主键上建立一个唯一索引,可以指定唯一索引的存储位置和存储参数

主键约束列值占用的空间不能超过一个数据块的大小

在主键约束的列上不能定义唯一约束

主键约束可以是列级约束,也可以是表级约束

(2).唯一性约束

列的取值必须唯一

Oracle自动在唯一性索引上建立一个唯一性索引,可以为该唯一性索引指定存储位置与参数

在唯一性约束的列上不能定义主键约束

唯一性约束可以是列级约束,也可以是表级约束

(3).检查约束

检查约束是用来限制列值允许的取值范围的,其表达式中必须引用相应列,并且表达式的计算结果必须是一个布尔值。

一个列可以定义多个检查约束

检查约束可以是列级约束,也可以是表级约束

(4).外键索引

定义外键约束的列的取值或者来源于参照表的参照咧,或者为空

定义外键约束的列只能参照主表中的主键约束或者是唯一约束列

可以在一列或者是多列组合上定义外键

外键约束所在表与参照变必须在同一个数据库中

外键约束可以是列级约束,也可以是表级约束

(5).非空约束

在同一个表中可以定义多个非空约束

非空约束不能定义在对象数据类型列上

非空约束只能是列级约束

2.约束的定义方式

(1)列级的约束

column_definition[CONSTRAINT constraint_name] constraint_type

(2)表级约束

column_definition[CONSTRAINT constraint_name] constraint_type

3.约束的状态

约束的状态分为激活状态(ENABLE)和禁用状态(DISABLE)状态两种。

当处于激活状态对数据的插入等进行检查,与约束冲突的操作将被回滚。

根据是否对表已有数据进行检查,约束状态分为验证状态与非验证状态两种。

创建与维护约束

SQL> create table jobs(
2 job_id varchar2(10) primary key,
3 job_title varchar2(35) not null unique
4 using index tablespace tbs1 storage(initial 64K next 64K),
5 min_salary number(6),
6 max_salary number(6)
7 )
8 tablespace users;

  

SQL> create table job_history
2 (
3 employee_id number(6) references employees(employee_id),
4 start_date date not null,
5 end_date date not null,
6 job_id varchar2(10) not null references jobs(job_id),
7 department_id number(4) references departments(departments_id),
8 constraint jh_dck check(end_date>start_date),
9 constraint jh_pk primary key(employee_id,start_date)
10 )
11 tablespace users; 表已创建。

可以使用 on delete cascade 和on delete set null来删除

3.添加、修改、删除约束

添加约束

SQL> create table books
2 (
3 id number(6),
4 title varchar2(10),
5 isbn number(20),
6 author varchar2(50),
7 price number(6,2),
8 describe varchar2(1000),
9 pid number
10 ); 表已创建。 SQL> alter table books add constraint books_pk primary key (id); 表已更改。 SQL> alter table books add constraint book_uk unique(isbn); 表已更改。 SQL> alter table books add constraint book_ck check(price between 0 and 200); 表已更改。 SQL> create table publish (
2 pid number primary key,
3 name char(20))l
4 ;
name char(20))l
*
第 3 行出现错误:
ORA-00922: 选项缺失或无效 SQL> create table publish (
2 pid number primary key,
3 name char(20))l
4
SQL> create table publish (
2 pid number primary key,
3 name char(20)); 表已创建。 SQL> alter table publish add constraint book_fk foreign key(pid) references publ
ish(pid); 表已更改。 SQL> alter table books modify title not null;

 修改约束

SQL> alter table books modify constraint book_ck validate;

表已更改。

SQL> alter table books modify primary key enable novalidate;

表已更改。

  重命名约束

SQL> alter table books rename constraint books_pk to books_pkey;

表已更改。

  删出约束

(1) 通过名称删除约束

SQL> alter table books drop constraint book_ck;

表已更改。

(2)通过制定类型删除主键约束或唯一索引

SQL> alter table books drop unique(isbn);

表已更改。

  (3)删除主键约束或唯一性约束时保留唯一性索引

SQL> alter table books drop constraint book_uk keep index;

表已更改。

  (4)删除主键约束或唯一性约束的同时删除字表中相应的外键约束

SQL> alter table publish drop primary key;
alter table publish drop primary key
*
第 1 行出现错误:
ORA-02273: 此唯一/主键已被某些外键引用 SQL> alter table publish drop primary key cascade;

  

4.禁用与激活约束

通常表中的约束应该处于激活的状态,但对一些操作,由于性能方面的需要暂时将约束设置为禁用状态。

利用sql*loader从外部数据源提取大量数据到数据库中

进行数据库数据大量的导入导出操作

针对表执行一项包含大量数据操作的批处理工作

1.禁用约束

SQL> alter table student disable unique(sname);

表已更改。

SQL> alter table student disable constraint s_pk;

表已更改。

 禁用时保留其唯一性索引

(2).激活约束

SQL> alter table student enable constraint s_pk;

表已更改。

SQL> alter table student modify constraint s_pk enable;

  5.验证约束状态

6.确定违反约束限制的记录

7,延迟约束检查

(1)创建具有引用关系的两个表,其中外键是可延迟的。

SQL> create table new_department(
2 deptno number primary key,
3 dname char(10) unique); 表已创建。 SQL> create table new_employee(
2 empno number primary key,
3 ename char(10),
4 deptno number constraint ne_fk references new_department(deptno)deferrable)
; 表已创建。 因为外键的完整性约束

SQL> insert into new_employee values(1,'zhang',10);
insert into new_employee values(1,'zhang',10)
*
第 1 行出现错误:
ORA-02291: 违反完整约束条件 (EHR.NE_FK) - 未找到父项关键字

  (2)延迟new——employee的外键检查

SQL> alter table new_employee modify constraint ne_fk initially deferred;

表已更改。

这样就可以先向new_employee插入数据,在插入主表数据。

  (3)将约束检查恢复

SQL> alter table new_employee modify constraint ne_fk initially immediate;

表已更改。

  

Oracle表约束的更多相关文章

  1. Oracle【二维表管理:约束】

    1.简单的表创建和字段类型最简单的方式去创建表(没有添加主键之类的约束条件)[Oracle的字段类型]number:数值类型--整数类型:number(a) 总长度a--小数类型:number(a,b ...

  2. oracle数据库表约束、视图、索引—该记录为本人以前微博的文章

    一.Oracle 数据库常用操作续关于创建表时创建约束1.创建表的时候增加约束----约束是定义表中的数据应该遵循的规则或者满足的条件----约束是建立在列上的,让某一列或者某几列数据之间有约束--- ...

  3. ORACLE添加表约束的语法示例

    转自:http://jingyan.baidu.com/article/f54ae2fccda68d1e93b84942.html 示例: --班级表 CREATE TABLE TCLASS( cl_ ...

  4. Oracle手边常用70则脚本知识汇总

    Oracle手边常用70则脚本知识汇总 作者:白宁超 时间:2016年3月4日13:58:36 摘要: 日常使用oracle数据库过程中,常用脚本命令莫不是用户和密码.表空间.多表联合.执行语句等常规 ...

  5. Oracle 数据导入导出

    一.导出模式(三种模式)及命令格式 1. 全库模式 exp 用户名/密码@网络服务名 full=y file=路径\文件名.dmp log=路径\文件名.log 2. 用户模式(一般情况下采用此模式) ...

  6. oracle入门必备

    //................创建表空间 \  赋予角色  \ 创建数据表  \  插入数据  \  创建序列  \ 添加注释   ........................... --创 ...

  7. oracle系统表查询

    oracle查询用户下的所有表 select * from all_tab_comments -- 查询所有用户的表,视图等select * from user_tab_comments -- 查询本 ...

  8. 26、Oracle(二)

    1)掌握多行函数与分组操作 2)掌握多表查询与子查询 3)理解集合查询与掌握Oracle分页语法 4)理解创建.修改和删除表和表约束 --------------------------------- ...

  9. Oracle数据库之三

    子查询 -- 就是在一个查询中包含多个select语句(一般就2个) select id,first_name,dept_id from s_emp; 想查询和Ben一个部门的员工的id,first_ ...

随机推荐

  1. MII接口概念简述

    MII: Medium Independent Interface 媒体独立接口,也称介质无关接口 RMII: Reduced MII 简化媒体独立接口 GMII: Gigabit Medium In ...

  2. python如何连接mysql数据库

    先花点时间来说说一个程序怎么和数据库进行交互1.和数据库建立连接2.执行sql语句,接收返回值3.关闭数据库连接使用MySQLdb也要遵循上面的几步.让我们一步步的进行. 1.MySQL数据库要用My ...

  3. linux 命令之 ping

    ping命令主要用于检測主机的连通性. 语法: ping [-dfnqrRv] [-c <完毕次数>] [-i <间隔秒数>] [-I <网络接口>] [-l &l ...

  4. 【ASP.NET】——AdRotator控件

    AdRotator控件即广告控件. 广告,是站点不可缺少的一部分.也是站点获取收益的最主要途径,但最初制作广告非常麻烦.asp.net就将该方法封装成了一个控件.为我们节省了非常多时间.这也是ASP. ...

  5. x264命令行工具(x264.exe)源码整体分析

    该命令行工具调用的是libx264,就是一个使用该库的示例程序 X264命令行工具的源代码在x264中的位置如下图所示(红框里面的). X264命令行工具的源代码的调用关系如下图所示. Additio ...

  6. 如何居中div?

    如何居中div? 水平居中 1 //给div设置一个宽度,然后添加margin:0 auto属性 2 3 div{ 4 width:200px; 5 margin:0 auto; 6 } 让绝对定位的 ...

  7. python 爬虫1 Urllib库的基本使用

    1.简单使用 import urllib2 response = urllib2.urlopen("http://www.baidu.com") print response.re ...

  8. sqlserver tips

    方括号内的表示一个对象名(视图,存储过程,表 等).列名:正常使用时,加不加一样,但是如果对象名是保留字的话,比如cascade,就必须加:不过建议不用保留字作为对象名 if object_id('[ ...

  9. 【转】开发者应该了解的API技术清单

    [转载贴] 作为一名开发者,诚然编写代码如同作家提笔挥毫,非常有成就感与乐趣,但同时我也觉得删除代码是件不相伯仲的美事.为什么呢?因为在进行删除工作 时,意味着自己找出了造成干扰的位置,意味着找到了冗 ...

  10. EasyNVR摄像机无插件直播流媒体服务器前端构建之输入框样式的调整

    EasyNVR授权方式分为软件的授权和硬件授权两种方式,软件授权需要在软件输入永久邀请码可以激化永久授权 起初我们的界面设计是为了满足功能的需求就是 ,用户可以输入激活码提交,完成永久授权. 在实际的 ...