zoukankan      html  css  js  c++  java
  • 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');

  • 相关阅读:
    试述软件的概念和特点?软件复用的含义?构件包括哪些?
    Spring Security基本用法
    java中跳出循环的方式
    cookie和session区别
    spring中类型注解下的bean的加载顺序
    常见的异常
    aop使用场景
    缓存类似于redis
    旧版redis使用
    获取rdis的几种方式
  • 原文地址:https://www.cnblogs.com/tengjiang/p/9063667.html
Copyright © 2011-2022 走看看