oracle数据库表约束、视图、索引—该记录为本人以前微博的文章
一、Oracle 数据库常用操作续关于创建表时创建约束
1、创建表的时候增加约束
----约束是定义表中的数据应该遵循的规则或者满足的条件
----约束是建立在列上的,让某一列或者某几列数据之间有约束
----约束可以在创建的表的同时创建约束,也可以在创建表之后再创建约束
----约束分为表级约束和列级约束,定义的方式不同,但是效果是相同的
----列级约束:列名 数据类型 【default 默认值】 【列级约束1 列级约束2……】
----表级约束:constraint 约束名称 约束类型(列名)
----表级约束可以自定义约束的名称,列级约束的名称由系统自动分配SYS_CN
----如果是多列之间的数据约束,只能使用表级约束定义
----not null 非空约束只能定义列级,不能定义表级约束
/*
主键约束——primary key
外键约束——foreign key
非空约束——not null
唯一约束——unique
检查约束——check
2、列级约束和表级约束
----外键的列级约束:references 表名(列名)
----外键的表级约束: constraint 约束名称 foreign key (列名) references 表名(列名)
//testdeptno number(3) constraint adsfa foreign key (testdeptno) references dept(deptno)
---创建表之后再创建或删除约束的方法:
----alter table 表名 modify 列名 not null; ---- 添加非空约束
----alter table 表名 add constraint 约束名称 约束类型(列名);----添加其他约束
----alter table 表名 modify 列名 null;-----删除非空约束
----alter table 表名 drop constraint 约束名称; ----删除其他约束
例子:
学生表:
列名 数据类型
st_id(主键) number(8)
st_name(非空) varchar2(14)
st_age(18岁以上) number(2)
st_phno(不能重复) number(11)
st_date(默认为当前系统时间) date
st_gender(非空,只能为男或女,默认为男) char(2)
st_grade(外键,关联班级表主键) number(4)
create table student
(
st_id number(8) primary key,
st_name varchar2(14) not null,
st_age number(2) check (st_age>=18),
st_phone number(11) unique,
st_date date default sysdate,
st_gender char(2) default 'M' not null check (st_gender in ('M','F')),
st_grade number(4) references grade(grade_id)
/*constraint 约束名称 foreign key (列名) references 表名(列名)
st_grade number(4) constraint adsad foreign key (st_grade) references grade(grade_id)
二、Orcale数据库操作续视图索引触发器
1、创建视图
create view empview as
select * from emp where comm is null;
创建视图时提示没有权限进行操作故进入isqlplus使用sys dba账户进行登录对scott用户进行授权:grant ada to scott,将scott授权为dba;
grant create view to scott;也是可以的;
2、修改视图
update empview set comm=comm+200 where ename='tengjiang';基本的操作和修改表是一样的;
注:对视图中的数据进行修改等同于对源表中的数据进行修改;
3、删除视图
delete empview where empno=1001;
4、修改视图结构操作同修改表结构,见上面内容,在此就不在赘述了;
5、联合查询
(1)、多表查询 参见笛卡尔积
select conut(e.ename) from emp e,dept d
where e.deptno=d.deptno amd d.dname='tengjiang';
(2)、子查询将查询结果做为一个子表,再在子表中进行查询
select count(ename) from emp where deptno=(select deptno from dept where dname='SALES');
(3)、多表查询和子表查询的差别:
a、查询次数:多表查询比子表查询查询次数多:
多表查询:m*n次
子表查询:m+n次
(4)、创建视图在查询
a、创建视图:
create view emp_dept as
select e.*,d.deptno dno,d.dname,d.loc from emp e,dept d
where e.deptno=d.deptno;
创建了一个emp_dept 的视图:将emp表和dept表外链接起来;
b、再在视图中查询
select count(ename) from emp_dept where dname='SALES';将部门名称为'SALES'的人数统计出来;
6、创建索引;
----索引(index),是建立在某一列数据上的目录,可以提高查询的效率
----经常作为查询条件的列,创建索引可以大幅度的提高查询效率
----索引分为两部分:rowid 和键值
----rowid是每行数据存储的物理地址,键值就是具体数据的取值
----索引主要有两种:B-树索引和位图索引
---(1)、B-树索引:基于二叉树结构的。B-树索引结构有3个基本组成部分:根结构、分支节点和叶子节点。
---其中根节点位于索引结构的最顶端,而叶子节点位于索引结构的最低端,中间为分支节点。
----B-树索引是oracle中默认的索引类型,是一个树状结构的目录
----create index 索引名称 on 表名(列名);
create index index_ename on emp(ename);
----确认索引的创建可以到这里查看
select * from user_indexes;
----索引创建好之后,当使用相关列查询数据时,索引会自动帮助查询语句提高效率
---当表中的数据发生变化时,索引会自动更新,不需要手动更新维护
---当数据大量的变化后,索引会产生一些碎片文件,占用空间并且影响效率
---可以定期对索引进行重建,清除碎片文件
(2)、位图索引
----B-树索引适合某列中有大量不同的数据
----当某一列中有大量重复的数据时,应该用位图索引
----位图索引不适合数据变化过于频繁的列
----create bitmap index 索引名称 on 表名(列名)
create bitmap index index_deptno on emp(deptno);
7、触发器
----触发器 trigger,与某些特定操作绑定的操作,不会主动实施,
----但当条件满足时,会在绑定的操作触发时同步操作。
/*
create (or replace) trigger 触发器名称
before/after
insert or update or delete
(of 列) on 表
(for each row)
(when (条件范围))
begin
触发操作(insert or update or delete);
end;
before和after定义触发的时间是在操作之前还是操作之后
insert or update or delete定义触发的操作
(of 列) on 表:定义对哪张表的哪一列操作时触发
for each row:定义是否每行数据都触发一次
when:中间作为条件的列,必须使用old或者new来限定,表示
修改前的列或者修改后的列
*/
-----先创建一张表用来存储相应的记录信息
create table record_dept30
(
ename varchar2(20),
old_job varchar2(20),
new_job varchar2(20),
rec date
);
select * from record_dept30
create trigger tri1
after
update
of job on emp
for each row
when (old.deptno=30)
begin
insert into record_dept30
values(:old.ename,:old.job,:new.job,sysdate);
end;
----在begin部分如果要调用表中的数据,使用:old和:new 来限定
8、阻止操作
----不允许对manager的工资进行修改
/*
触发时间:before、after
触发操作:update、delete、insert
触发对象:emp表中sal列
触发的范围:职位是manager
*/
/*
阻止操作使用raise_application_error(作为id,错误提示) 方法,强制提交一个错误
错误id是自定义的,推荐使用-20000~29999之间的数字,错误提示自定义文本
*/
create or repaley trigger tri2
before
update
of sal on emp
for each row
when (old.job='MANAGER')
begin
raise_application_error(-20001,'ddssfadfadsfas');
oracle数据库表约束、视图、索引—该记录为本人以前微博的文章的更多相关文章
- Oracle数据库之视图与索引
Oracle数据库之视图与索引 1. 视图简介 视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改. 视图基于的表称为基表,视图是存储在数据字典里的一条SE ...
- oracle 数据库 主键索引重建
oracle 数据库 主键索引重建 alter table table_name drop primary key; alter table table_name add constraint pk_ ...
- Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表. ---查询语句创建表 create table emp a ...
- Oracle 数据库备份还原(Expdp/impdp)记录
最近公司将原数据库服务器切换.之前没整过这块,也是一堆的度娘.经过不停的摸索,终于成功了.现在将这份艰辛记录下来,方便自己以后查阅的同时,方便有类似需求的同学参考. 我们此次切换共分:ERP.LOS. ...
- Oracle数据库的视图
使用视图的优点: 1.简化数据操作:视图可以简化用户处理数据的方式. 2.着重于特定数据:不必要的数据或敏感数据可以不出现在视图中. 3.视图提供了一个简单而有效的安全机制,可以定制 ...
- Oracle数据库学习 视图、序列及存储过程
视图(View) 视图也被称作虚表,也就是虚拟的表,是一组数据的逻辑表示. 视图对应一个select语句,结果集被赋予一个名字,也就是视图的名字. 视图本身不包含任何数据,它只是包含映射到基表的一个查 ...
- Oracle数据库---序列、索引、同义词
--创建序列create sequence deptno_seqstart with 50increment by 10maxvalue 70cache 3; --为了方便演示,创建了一个和dept表 ...
- ORACLE 数据库需要创建索引的规则
1.表的主键.外键必须有索引: 2.数据量超过300的表应该有索引: 3.经常与其他表进行连接的表,在连接字段上应该建立索引: 4.经常出现在Where子句中的字段,特别是大表的字段,应该建立索引: ...
- Oracle数据库随机取某条记录的一个字段值
思路: 先将取出的值随机排序,然后在随机排序的每次取第一条的结果 举例如下: select * from(select t.code fromTBIZOPS_PROVINCE t ORDER BY ...
随机推荐
- C# 练习题 打印出100-999之间所有的”水仙花数”
题目:打印出100-999之间所有的”水仙花数”,所谓”水仙花数”是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个”水仙花数”,因为153=1的三次方+5的三次方+3的三次方.1.程序 ...
- BootStrap-treeview 参考
简要教程 bootstrap-treeview是一款效果非常酷的基于bootstrap的jQuery多级列表树插件.该jQuery插件基于Twitter Bootstrap,以简单和优雅的方式来显示一 ...
- MTSC2019大会日程重磅发布,腾讯WeTest独家Topic大揭秘!
WeTest 导读 中国移动互联网测试开发大会 Mobile Testing Summit China(简称 MTSC)是由国内最大的移动测试技术社区 TesterHome 发起的软件测试行业技术会议 ...
- Vue--运行项目发送http://localhost:8080/sockjs-node/info请求报错,造成浏览器不能热更新
今早习惯打开vscode 输入 npm run dev 准备修复测试提出的bug 不料一堆通红的报错,让人感到有点绿的慌. 有问题呢,就需要解决问题.经过一番排查后发现是我昨天为了让测试在我本地项目中 ...
- python如何通过windows命令行运行一个python程序文件?
python如何通过windows命令行运行一个python程序文件? cmd 进入到py文件对应目录下或者直接在上面的文件地址栏输入cmd,敲入回车 定位到对应的目录下 输入python xxx.p ...
- Java执行shell脚本并返回结果两种方法的完整代码
Java执行shell脚本并返回结果两种方法的完整代码 简单的是直接传入String字符串,这种不能执行echo 或者需要调用其他进程的命令(比如调用postfix发送邮件命令就不起作用) 执行复杂的 ...
- 谁有好的oracle数据库学习书籍,麻烦提供一下,感激不尽
作为一个IT人员,想深入学习一下oracle,以前都只是懂基本的语法,CRUD 数据库设计,数据库优化,底层完全不懂,哪位仁兄有好的书籍可以推荐一下,感激不尽.
- BeyondCompare4破解方法
因为工作需要,经常会用到BeyondCompare4这个软件,但是从官方下载的BeyondCompare4只有一个月的试用期,点击输入密钥又一直打开购买软件的页面,所以就一开始就用了最笨的方法,软件的 ...
- Django框架(二十)-- Django rest_framework-权限组件
一.权限组件的使用 # 用户信息表 class UserInfo(models.Model): name = models.CharField(max_length=32) # 写choice use ...
- odoo10学习笔记十七:controller
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189391.html 一:controller简述 odoo里面的controller相似于springM ...