约束的概念:
约束是在表中定义的用于维护数据库完整性的一些规则。通过为表中的字段定义约
束,可以防止将错误的数据插入到表中。

注意:
1.如果某个约束只作用于单独的字段,既可以在字段级定义约束,也可以在表级定义约束;但如果某个约束将作用于多个字段,必须在表级定义约束。
2.oracle中的约束通过名称来进行识别。在定义约束时可以通过constraint关键字为约束命名。如果用户没有为约束指定名称,oracle将自动为约束建立默认的名称。

主键约束(primary key):
主键约束的特点:
 定义为主键约束的字段中不能包含任何重复值,并且不能包含null值。
 同1个表中只能定义1个主键约束。
 可以为一个字段定义主键约束,也可以为多个字段的组合定义主键约束。
 oracle会自动为具有主键约束的字段建立1个唯一索引和1个非空约束。
例如:
 create table person
 (
       p_id int primary key,        --定义该字段为主键约束
       p_name varchar2(20),
       p_age int

--constraint p_pk primary key (p1_id)

);

create table person
(
       p_id int constraint p_pk primary key,    --定义该字段为主键约束,并指定约束名字
       p_name varchar2(20),
       p_age int

--constraint p_pk primary key (p1_id)
);

create table person
(
       p_id int,
       p_name varchar2(20),
       p_age int,
       constraint p_pk primary key (p_id,p_name)--定义复合主键,并指定名字

--primary key(p_id,p_name)
);

非空约束(not null):
非空约束的特点:
 定义了非空约束的字段中不能包含null值。
 只能在字段级定义非空约束。
 在同一个表中可以定义多个非空约束。

例如:
create table person
(
       p_id int,
       p_name varchar2(20) not null, --定义该列的非空约束
       p_age int
 );

唯一约束(unique):
唯一约束的特点:
 定义了唯一约束的字段中不能包含重复值。
 可以为1个字段定义唯一约束,也可以为多个字段的组合定义唯一约束。因此,唯一约束既可以定义在字段级,也可以定义在表级。
 oracle会自动为具有唯一约束的字段建立1个唯一索引。
 对同一字段可以同时定义非空和唯一约束。
 如果在1个字段上仅定义了唯一约束,而没有定义非空约束,则该字段可以包含多个null值。

例如:
create table person
(
       p_id int,
       p_name varchar2(20) unique,--定义该列的唯一约束
       p_age int
);

create table person
(
       p_id int,
       p_name varchar2(20) constraint p_un unique not null, --同时定义唯一和非空约束
       p_age int
);

create table person
(
       p_id int,
       p_name varchar2(20),
       p_age int,
       constraint p_un unique(p_name) --指定约束名字
);

外键约束(foreign key)
 外键约束的特点:
  定义为外键约束的字段中只能包含相应的其他表中引用字段的值或null值。
  可以为1个字段定义外键约束,也可以为多个字段的组合定义外键约束。
  定义了外键约束的字段和相应的引用字段可以存在于同1个表中,称为自引用。
  对同1个字段可以同时定义外键和非空约束。
  主表中的被引用列,必须有主键约束或唯一约束。

例如:
 create table person
 (
       p_id int,
       p_name varchar2(20),
       p_age int,
       w_id int,
       constraint p_fk foreign key (w_id) references works(w_id)            --外键约束
  );
 create table person
      (
       p_id int,
       p_name varchar2(20),
       p_age int,
       w_id int constraint p_fk references works-- 外键约束,引用works表中的主键
  );

create table person
 (
       p_id int,
       p_name varchar2(20),
       p_age int,
       w_id int references works       --外键约束
  -- w_id int constraint w_fk references works(w_id)
  );

在定义外键约束时,还可以通过on关键字来指定引用行为的类型。当主表中的一条记录被删除时,需要通过引用行为来确定如何处理子表中的外键列的值。
删除子表中所有相关的记录(delete cascade),
将所有相关记录的外键值设置为null(delete set null)

检查约束(check)
 检查约束的特点:
  在检查约束的表达式中必须引用到表中的一个或多个字段,并且表达式的计算结果必须是一个布尔值。
  在表达式中不能包含子查询。
  在表达式中不能包含sysdate,uid,user,userenv等sql函数,也不能包含rowid,rownum等伪列。
  检查约束可以在字段级和表级定义。
  对同一个字段可以定义多个检查约束,而且对同一个字段可以同时定义检查约束和非空约束。

例如:
  create table person
(
       p_id int,
       p_name varchar2(20),
       p_age int check(p_age > 20)   --检查约束
    -- constraint p_check check(p_age > 20)      --检查约束
);
  create table person
(
       p_id int,
       p_name varchar2(20),
       p_age int constraint p_check check(p_age > 20)  --检查约束
     -- constraint p_check check(p_age > 20)      --检查约束
);

增加约束
如果增加UNIQUE、PRIMARY KEY、FOREIGN KEY 和CKECK 必须使用ALTER TABLE语句的ADD子句;

如果增加NOT NULL约束,那么必须使用ALTER TABLE语句的MODIFY子句,如:
ALTER TABLE table_name ADD [CONSTRAINT constraint_name]
constraint_type (column,...)
ALTER TABLE table_name MODIFY column
[CONSTRAINT constraint_name] NOT NULL;

添加外键约束
alter table emp add foreign key (deptno) references dept(deptno);

alter table emp add constraint d_fk foreign key (deptno) references dept(deptno);

添加主键约束
 alter table table_name add primary key(column_name);

alter table table_name add constraint t_pk primary key(column_name);

添加非空约束

alter table person modify p_name not null;

alter table person modify p_name constraint t_notnull not null;

约束延迟(在事务提交时再验证,默认为不延迟)
 deferrable --延迟验证
 not deferrable --不延迟验证(默认)
 单独deferrable的含义就是是否允许约束检查延后进行。单独设置deferrable为deferrable之后,约束检查延后是不可以直接使用的,要配合deferred参数,如果该参数是immediate,那么约束还是在DML的时候进行应用。如果deferred参数设置为deferred,约束就是在事务commit提交的时候应用,出现错误就连带回滚rollback整个事务

创建约束时,可指定开启延迟
 create table tt
(
   id int primary key deferrable initially deferred
);

set constraints 约束名 immediate; 关闭约束延迟
 set constraints 约束名 deferred; 开启约束延迟

也可以在session级设置
 alter session set constraints=immediate;
 alter session set constraints=deferred;

重命名约束

alter table 表名 rename constraint 原约束名 to 新约束名
删除约束
 alter table 表名 drop constraint 约束名;
 alter table 表名 drop constraint 约束名 cascade; -‍-删除主键时级联删除子表的外键约束

约束失效
 alter table 表名  disable constraint 约束名

alter table 表名  disable constraint 约束名cascade; --失效主键时级联删除子表的外键约束
约束生效
 alter table 表名 enable constraint 约束名

novalidate: --不验证老数据
validate:--验证老数据
控制现有数据是否应用约束,例如
alter table t2 deferrable enable novalidate constraint SYS_C007211; -- 约束生效,不验证已有数据是否符合约束条件

alter table t2 enable validate constraint SYS_C007211;  -- 约束生效,同时验证已有数据是否符合约束条件

alter table t2 disable validate constraint SYS_C007211;

--约束失效,同时验证已有数据是否符合约束条件,之后不能对该表进行dml操作,否则会报ORA-25128错误
 
alter table t2 disable novalidate constraint SYS_C007211;
-- 约束失效,不验证已有数据是否符合约束条件(默认)

注:约束生效(enable)后的操作都受约束的限制。

查询约束信息
 视图名字       描述
 all_constraints   包含所有的约束基本描述信息,包括约束的名字、类型、状态、延迟性等信息
 dba_constraints
 user_constraints

all_cons_columns   包含定义课约束的字段信息,利用这个视图可以查看约束定义在哪些字段上
 dba_cons_columns
 user_cons_columns

Oracle约束操作的更多相关文章

  1. ORACLE约束总结

    你对ORACLE约束的了解如何?比较模糊还是相当透彻?如果你对下面几个问题了如指掌的话,恭喜你,你已经对约束掌握得比较好了,不用看这篇文章了.ORACLE的约束有啥功能作用? 有哪些类型约束(不同版本 ...

  2. 【Oracle】Oracle约束的总结

    你对ORACLE约束的了解如何?比较模糊还是相当透彻?如果你对下面几个问题了如指掌的话,恭喜你,你已经对约束掌握得比较好了,不用看这篇文章了.ORACLE的约束有啥功能作用? 有哪些类型约束(不同版本 ...

  3. oracle约束约束状态和设计习惯

    oracle约束状态有几个项目,会让人迷惑,分别是: enable/disable--是否启用/禁用 validate/invalidate--确认/不确认 deferrable/not deferr ...

  4. 转 ORACLE约束总结

    https://www.cnblogs.com/kerrycode/archive/2012/05/13/2454614.html 你对ORACLE约束的了解如何?比较模糊还是相当透彻?如果你对下面几 ...

  5. [转]Oracle 树操作(select…start with…connect by…prior)

    转自http://www.cnblogs.com/linjiqin/archive/2013/06/24/3152674.html Oracle 树操作(select-start with-conne ...

  6. Oracle列操作(增加列,修改列,删除列)

    Oracle列操作 增加一列: alter table emp4 add test varchar2(10); 修改一列: alter table emp4 modify test varchar2( ...

  7. 基于OCILIB的oracle数据库操作总结及自动生成Model和Dao的工具

    基于OCILIB的oracle数据库操作总结 1.       类图 2.       基类BaseOCIDao的设计与实现 BaseOCIDao.h头文件 #pragma once /* ----- ...

  8. Oracle集合操作函数:union、intersect、minus

    [转]Oracle集合操作函数:union.intersect.minus 集合操作符专门用于合并多条select 语句的结果,包括:UNION, UNION ALL, INTERSECT, MINU ...

  9. Oracle 树操作

    Oracle 树操作(select…start with…connect by…prior) oracle树查询的最重要的就是select…start with…connect by…prior语法了 ...

随机推荐

  1. Linux系统调优

    Linux核心参数都是放置在/proc下面:系统的参数都是放置在/proc/sys swap最好放置在运行最快的硬盘上面,但是swap并能取代ram,因为并有I/O上面的损耗,所以优先考虑检验内存没有 ...

  2. 提交App Store注意事项1

    1.未遵守苹果iOS APP数据储存指导方针. 如果你的App有离线数据下载功能,尤其需要关注这一点.因为离线数据一般占用存储空间比较大,可以被重新下载和重建,但是用户往往希望系统存储空间紧时也依然能 ...

  3. python面向对象高级编程

    正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> class Studen ...

  4. [转贴]JAVA :RESTLET开发实例(一)基于JAX-RS的REST服务

    RESTLET介绍 Restlet项目为“建立REST概念与Java类之间的映射”提供了一个轻量级而全面的框架.它可用于实现任何种类的REST式系统,而不仅仅是REST式Web服务. Restlet项 ...

  5. Android Training精要(四) Intent注意事项

    判断有处理Intent的Activity PackageManager packageManager = getPackageManager(); List<ResolveInfo> ac ...

  6. 【HDOJ】1198 Farm Irrigation

    其实就是并查集,写麻烦了,同样的代码第一次提交wa了,第二次就过了. #include <stdio.h> #include <string.h> #define MAXNUM ...

  7. React入门2

    React 入门实例教程 最简单开始学习 JSX 的方法就是使用浏览器端的 JSXTransformer.我们强烈建议你不要在生产环境中使用它.你可以通过我们的命令行工具 react-tools 包来 ...

  8. Android4.0 -- UI控件之 Menu 菜单的的使用(三)

    上一讲 [Android 开发]:UI控件之 Menu 菜单的的使用(二) 我们讲解了创建上下文菜单的第一种使用方式:Creating a floating context menu [创建悬浮的上下 ...

  9. android学习——环境搭建之HelloWorld

    一.在开始Android开发之旅启动之前,首先要搭建环境,然后创建一个简单的HelloWorld.本文的主题如下: 1.1.JDK安装 1.2.Eclipse安装 1.3.Android SDK安装 ...

  10. DevExpress中XtraGrid控件对GridView每行的颜色设置 zt

    改变行颜色 private void GridView1_RowStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowStyleEventArg ...