/*** 约束 ***/

* 如果某个约束只作用于单独的字段,即可以在字段级定义约束,也可以在表级定义约

束,但如果某个约束作用于多个字段,
  必须在表级定义约束
* 在定义约束时可以通过CONSTRAINT关键字为约束命名,如果没有指定,ORACLE将自动

为约束建立默认的名称

定义primary key约束(单个字段)
create table employees (empno number(5) primary key,...)

指定约束名
create table employees (empno number(5) constraint emp_pk primary key,...)

定义primary key约束(多个字段,在表级定义约束)
create table employees 
(empno number(5),
 deptno number(3) not null,
 constraint emp_pk primary key(empno,deptno)
 using index tablespace indx
 storage (initial 64K
   next 64K
  )
)

ORACLE自动会为具有PRIMARY KEY约束的字段(主码字段)建立一个唯一索引和一个NOT

NULL约束,定义PRIMARY KEY约束时可以为它的索引
指定存储位置和存储参数

alter table employees add primary key (empno)
alter table employees add constraint emp_pk primary key (empno)
alter table employees add constraint emp_pk primary key (empno,deptno)

not null约束(只能在字段级定义NOT NULL约束,在同一个表中可以定义多个NOT NULL约

束)
alter table employees modify deptno not null/null

unique约束
create table employees 
( empno number(5),
  ename varchar2(15),
  phone varchar2(15),
  email varchar2(30) unique,
  deptno number(3) not null,
  constraint emp_ename_phone_uk unique (ename,phone)
)

alter table employees 
add constraint emp_uk unique(ename,phone)
using index tablespace indx

定义了UNIQUE约束的字段中不能包含重复值,可以为一个或多个字段定义UNIQUE约束,

因此,UNIQUE即可以在字段级也可以在表级定义,
在UNIQUED约束的字段上可以包含空值.

foreign key约束

* 定义为FOREIGN KEY约束的字段中只能包含相应的其它表中的引用码字段的值或者

NULL值
* 可以为一个或者多个字段的组合定义FOREIGN KEY约束
* 定义了FOREIGN KEY约束的外部码字段和相应的引用码字段可以存在于同一个表中,

这种情况称为"自引用"
* 对同一个字段可以同时定义FOREIGN KEY约束和NOT NULL约束

定义了FOREIGN KEY约束的字段称为"外部码字段",被FORGIEN KEY约束引用的字段称为"

引用码字段",引用码必须是主码或唯一码,包含外部码的表称为子表,
包含引用码的表称为父表.

A:
create table employees 
(.....,
 deptno number(3) NOT NULL, 
 constraint emp_deptno_fk foreign key (deptno)
 references dept (deptno)
)

如果子表中的外部码与主表中的引用码具有相同的名称,可以写成:
B:
create table employees 
(.....,
 deptno number(3) NOT NULL 
 constraint emp_deptno_fk references dept
)

注意:
上面的例子(B)中not null后面没有加逗号,因为这一句的contraint是跟在那一列

deptno后面的,属于列定义,所以都无需指明列。而A例中的是表定义,需要指明那一

列,所以要加逗号,不能在列后面定义,还可以写成:

create table employees
(empno char(4),
 deptno char(2) not null constraint emp_deptno_fk references dept,
 ename varchar2(10)
)
表定义contraint的只能写在最后,再看两个例子:

create table employees
(empno number(5),
 ename varchar2(10),
 deptno char(2) not null constraint emp_deptno_fk references dept,
 constraint emp_pk primary key(empno,ename)
)

create table employees
( empno number(5),
  ename varchar2(15),
  phone varchar2(15),
  email varchar2(30) unique,
  deptno number(3) not null,
  constraint emp_pk primary key(empno,ename),
  constraint emp_phone_uk unique (phone)
)

添加foreign key约束(多字段/表级)
alter table employees
add constraint emp_jobs_fk foreign key (job,deptno) 
references jobs (jobid,deptno)
on delete cascade

更改foreign key约束定义的引用行为(delete cascade/delete set null/delete no

action),默认是delete on action

引用行为(当主表中一条记录被删除时,确定如何处理字表中的外部码字段):
delete cascade :  删除子表中所有的相关记录
delete set null : 将所有相关记录的外部码字段值设置为NULL
delete no action:  不做任何操作

先删除原来的外键约束,再添加约束
ALTER TABLE employees DROP CONSTRAINT emp_deptno_fk;
ALTER TABLE employees ADD CONSTRAINT emp_deptno_fk FOREIGN KEY(deptno)

REFERENCES dept(deptno) ON DELETE CASCADE;

check约束
* 在CHECK约束的表达式中必须引用到表中的一个或多个字段,并且表达式的计算结果

必须是一个布尔值
* 可以在表级或字段级定义
* 对同一个字段可以定义多个CHECK约束,同时也可以定义NOT NULL约束

create table employees 
(sal number(7,2)
 constraint emp_sal_ck1 check (sal > 0)
)

alter table employees
add constraint emp_sal_ck2 check (sal < 20000 br style='font-size:14px;font-style:normal;font-weight:normal;color:rgb(0, 0, 0);' />
删除约束

alter table dept drop unique (dname,loc)   --指定约束的定义内容
alter table dept drop constraint dept_dname_loc_uk --指定约束名

删除约束时,默认将同时删除约束所对应的索引,如果要保留索引,用KEEP INDEX关键


alter table employees drop primary key keep index

如果要删除的约束正在被其它约束引用,通过ALTER TABLE..DROP语句中指定CASCADE关

键字能够同时删除引用它的约束

利用下面的语句在删除DEPT表中的PRIMARY KEY约束时,同时将删除其它表中引用这个

约束的FOREIGN KEY约束:
alter table dept drop primary key cascade

禁用/激活约束(禁用/激活约束会引起删除和重建索引的操作)
alter table employees disable/enable unique email
alter table employees disable/enable constraint emp_ename_pk
alter tabel employees modify constraint emp_pk disable/enable
alter tabel employees modify constraint emp_ename_phone_uk disable/enable

如果有FOREIGN KEY约束正在引用UNIQUE或PRIMARY KEY约束,则无法禁用这些UNIQUE或

PRIMARY KEY约束,
这时可以先禁用FOREIGN KEY约束,然后再禁用UNIQUE或PRIMARY KEY约束;或者可以在

ALTER TABLE...DISABLE
语句中指定CASCADE关键字,这样将在禁用UNIQUE或PRIMARY KEY约束的同时禁用那些引

用它们的FOREIGN KEY约束,如:
alter table employees disable primary key cascade

约束数据字典
all_constraints/dba_constraints/user_constraints 约束的基本信息,包括约束的

名称,类型,状态
(约束类型:C(CHECK约束),P(主码约束),R(外部码约束),U(唯一码约束))
all_cons_columns/dba/user 约束对应的字段信息

/*** 索引 ***/

索引和对应的表应该位于不同的表空间中,oracle能够并行读取位于不同硬盘上的数据

,可以避免产生I/O冲突
B树索引:在B树的叶节点中存储索引字段的值与ROWID。
唯一索引和不唯一索引都只是针对B树索引而言.
Oracle最多允许包含32个字段的复合索引

索引创建策略
1.导入数据后再创建索引
2.不需要为很小的表创建索引
3.对于取值范围很小的字段(比如性别字段)应当建立位图索引
4.限制表中的索引的数目
5.为索引设置合适的PCTFREE值
6.存储索引的表空间最好单独设定

创建不唯一索引
create index emp_ename on employees(ename)
tablespace users
storage(......)
pctfree 0;

创建唯一索引
create unique index emp_email on employees(email)
tablespace users;

创建位图索引
create bitmap index emp_sex on employees(sex)
tablespace users;

创建反序索引
create unique index order_reinx on orders(order_num,order_date)
tablespace users
reverse;

创建函数索引(函数索引即可以是普通的B树索引,也可以是位图索引)
create index emp_substr_empno
on employees(substr(empno,1,2))
tablespace users;

修改索引存储参数(与表类似,INITIAL和MINEXTENTS参数在索引建立以后不能再改变)
alter index emp_ename storage(pctincrease 50);

由于定义约束时由oracle自动建立的索引通常是不知道名称的,对这类索引的修改经常

是利用alter table ..using index语句进行的,而不是alter index语句

利用下面的语句将employees表中primary key约束对应的索引的PCTFREE参数修改为5
alter table employees enable primary key using index pctfree 5;

清理索引碎片
1.合并索引(只是简单的将B树叶结点中的存储碎片合并在一起,并不会改变索引的物理

组织结构)
alter index emp_pk coalesce;

2.重建索引(不仅能够消除存储碎片,还可以改变索引的全部存储参数设置,并且可以将

索引移动到其它的表空间中,重建索引
实际上就是再指定的表空间中重新建立一个新的索引,然后删除原来的索引)
alter index emp_pk rebuild;

删除索引
drop index emp_ename;

如果索引中包含损坏的数据块,或者包含过多的存储碎片,需要首先删除这个索引,然

后再重建它.
如果索引是在创建约束时由oracle自动产生的,可以通过禁用约束或删除约束的方法来

删除对应的索引.
在删除一个表时,oracle会自动删除所有与该表相关的索引.

索引数据字典
all_indexes/dba_indexes/user_indexes 索引的基本信息
all_ind_columns/dba_ind_columns/user_ind_columns 索引对应的字段信息

转载于:https://www.cnblogs.com/hllnj2008/p/5127174.html

ORACLE学习笔记 索引和约束相关推荐

  1. Oracle学习笔记---(一)

    Oracle学习笔记---(一) 一 1.Oracle简介     Oracle是以高级结构化查询语言(SQL)为基础的大型关系数据库:是一个对象关系数据库管理系统(ORDBMS).它提供了关系数据库 ...

  2. oracle update单引号,Oracle学习笔记:update的字段中包括单引号

    平时update的时候直接更改字段内的值,例如: update table_temp set name = 'Hider' where id = 100; 但更新后的值中包括单引号,则不能按以上方式进 ...

  3. oracle:oracle学习笔记(四)循环、光标、异常、瀑布模型

    oracle学习笔记:循环.光标.异常 文章目录 打印Hello World 定义基本变量 引用型变量(单行)` my_name emp.ename%type ` 记录型变量(多行) `emp_rec ...

  4. 在大量数据迁移期间oracle学习笔记

    在数据迁移期间oracle学习笔记 0主键(自增) 1用户代码 2区域代码 3承保公司代码 4理赔编码 5投保确认码 6案件状态 7案件进展 8重开案件进展 9转换后案件状态 需求分析: 1.根据上述 ...

  5. oracle 权限问题9017,[数据库]oracle学习笔记(一)用户管理_星空网

    oracle学习笔记(一)用户管理 2014-04-13 0 1 --oracle学习第一天 2 --连接 @后面连接数据库实例,具体连接到那个数据库 3 conn scott/tiger@MYORA ...

  6. 【Oracle】Oracle学习笔记

    [Oracle]Oracle学习笔记 目录 [Oracle]Oracle学习笔记 P1.Oracle数据库的安装和配置 P2.Oracle数据库管理 P3-0.初步SQL P3-1.基本SQL SEL ...

  7. oracle学习笔记 Oracle体系结构概述

    oracle学习笔记 Oracle体系结构概述 从这节开始,开始讲oracle数据库体系结构. 首先从总体上,从概述上把oracle整体的体系结构讲一下, 然后接下来的时间我们会一块一块的将oracl ...

  8. Oracle学习笔记 字符集概述

    Oracle 学习笔记 字符集概述 这节课开始讲oracle里面的字符集 偏重于原理和简单的一些判断以及实现 字符集它涉及到很多的东西 比如建库和操作系统环境 这节课把字符集的原理性的东西以及常见的操 ...

  9. oracle学习笔记 oracle软件安装准备工作 第一部分 环境准备

    oracle学习笔记   oracle软件安装准备工作  第一部分 环境准备 这节课对初学者来说内容较多,我把它分成了三篇. 即使这样也不可能把每个可能遇到的问题都说到,如果遇到没说到的问题自己上网搜 ...

最新文章

  1. 使用Vant框架的组件van-pull-refresh搭配van-list和van-card完成上滑加载更多列表数据,下拉刷新当前列表数据(等同于翻页功能)
  2. winlogon.exe病毒的查杀方法
  3. 【毕业求职季】-听说你想去大厂看学妹,带你看看阿里后端实习面经长啥样?
  4. 如何计算和控制好项目开发成本?
  5. 从雷军那里反思,做什么样的公司?
  6. 在 Java 中,如何批量读取本项目资源目录下的所有文件
  7. 血红蛋白判断access程序答案_普渡大学开发智能手机应用程序 帮助评估贫血症情况...
  8. 吃冰淇淋更容易溺水?
  9. basler 相机使用出现的问题
  10. 一个页面多个ajax统一loading,页面有多个向后台发送的请求加载过程中显示loading,加载完成loading消失...
  11. 爬虫伪装请求头-fake-useragent
  12. 学生表,选课表,课程表
  13. 我的007之skyfall歌词鉴赏及翻译
  14. CTF练习题——bugkuCTF 网站被黑题目思路分析
  15. Tensorflow学习-自定义模型
  16. 循环结构验证哥德巴赫猜想
  17. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛) 题解
  18. 在Linux服务器上解压rar压缩文件
  19. android视频开发面试!金三银四我带你去BAT面试现场,附带学习经验
  20. 内部版本7600无法安装ie9浏览器

热门文章

  1. 如何从0到1搭建大数据平台
  2. win7下CSP修改方法
  3. RHEL8/CentOS8中文输入法
  4. C语言001-hello joa
  5. 如何发现撒谎者,确保所有人能贯彻执行
  6. 数据库分片(Database Sharding)详解
  7. 【Neo4j】第 7 章:社区检测和相似性措施
  8. if 我是前端团队 Leader,怎么制定前端协作规范?
  9. IgH详解十一、IgH(FSM)有限状态机
  10. 武汉大学计算机学院有什么实验室,武汉大学计算机学院实验室 - 安全牛课堂 - 领先的信息安全在线教育平台...