oracle_约束与视图

oracle_约束与视图

  1. 约 束 constraint
  2. 视 图
  3. 序列
  4. 索引
  5. 同义词
描述约束
什么是约束
    约束是表级的强制规定
    有以下五种约束:
    NOT NULL 不为空
    UNIQUE  唯一
    PRIMARY KEY 主键
    FOREIGN KEY 外键
    CHECK 检查约束
    

注意事项
    如果不指定约束名 ,Oracle server 自动按照 SYS_Cn 的格式指定约束名
    创建和修改约束:
    建表的同时
    建表之后
    可以在表级或列级定义约束
    可以通过数据字典视图查看约束
    
表级约束和列级约束
    作用范围:
    ①列级约束只能作用在一个列上
    ②表级约束可以作用在多个列上(当然表级约束也   
        可以作用在一个列上)
    定义方式:列约束必须跟在列的定义后面,表约束不与列一起,而是单独定义。
    非空(not null) 约束只能定义在列上
    
定义约束
    CREATE TABLE employees(
         employee_id  NUMBER(6),
             first_name   VARCHAR2(20),
         ...
         job_id       VARCHAR2(10) NOT NULL,--(NOT NULL 列级约束)
         CONSTRAINT emp_emp_id_pk 
                    PRIMARY KEY (EMPLOYEE_ID));--(CONSTRAINT 表级约束)
                    
NOT NULL 约束                 
    只能定义在列级:
UNIQUE 约束
  唯一约束,允许出现多个空值:NULL。
  可以定义在表级或列级
    CREATE TABLE employees(
    employee_id      NUMBER(6),
    last_name        VARCHAR2(25) UNIQUE,
    email            VARCHAR2(25),
    salary           NUMBER(8,2),
    commission_pct   NUMBER(2,2),
    hire_date        DATE NOT NULL,
...  
    CONSTRAINT emp_email_uk UNIQUE(email));
    
PRIMARY KEY 约束
    可以定义在表级或列级:
    CREATE TABLE   departments(
    department_id        NUMBER(4),
    department_name      VARCHAR2(30)
      CONSTRAINT dept_name_nn NOT NULL,
    manager_id           NUMBER(6),
    location_id          NUMBER(4),
      CONSTRAINT dept_id_pk PRIMARY KEY(department_id));
      
FOREIGN KEY 约束
    可以定义在表级或列级:
    create table test_a(
        id number not null primary key,
       name varchar2(50)
    );
    create table test_b(
        id number not null primary key,
        test_aId number references test_a(id), -- 设置外键约束
        name varchar2(50)
    )
    ALTER TABLE test_b  

    add CONSTRAINT fk_testId 

    FOREIGN KEY (test_aId) REFERENCES test_a(ID);

    --其中 fk_testId 是外键名称
FOREIGN KEY 约束的关键字
    FOREIGN KEY: 在表级指定子表中的列
    REFERENCES: 标示在父表中的列
    ON DELETE CASCADE(级联删除): 当父表中的列被删除时,子表中相对应的列也被删除
    ON DELETE SET NULL(级联置空): 子表中相应的列置空
有三种形式的外键约束:

    1、普通外键约束(如果存在子表引用父表主键,则无法删除父表记录)

    2、级联外键约束(可删除存在引用的父表记录,而且同时把所有有引用的子表记录也删除)

    3、置空外键约束(可删除存在引用的父表记录,同时将子表中引用该父表主键的外键字段自动设为NULL,但该字段应允许空值)

这三种外键约束的建立语法如下:

例如有两张表 父表T_INVOICE主键ID。子表T_INVOICE_DETAIL外键字段INVOICE_ID

    1、普通外键约束:
    ALTER TABLE T_INVOICE_DETAIL ADD CONSTRAINT FK_INVOICE_ID FOREIGN KEY (INVOICE_ID ) REFERENCES T_INVOICE(ID);
    2、级联外键约束:
    ALTER TABLE T_INVOICE_DETAIL ADD CONSTRAINT FK_INVOICE_ID FOREIGN KEY (INVOICE_ID ) REFERENCES T_INVOICE(ID) ON DELETE CASCADE ;
    3、置空外键约束:
    ALTER TABLE T_INVOICE_DETAIL ADD CONSTRAINT FK_INVOICE_ID FOREIGN KEY (INVOICE_ID ) REFERENCES T_INVOICE(ID) ON DELETE SET NULL ;


CHECK 约束
    定义每一行必须满足的条件

添加约束的语法
    使用 ALTER TABLE 语句:
    添加或删除约束,但是不能修改约束
    有效化或无效化约束
    添加 NOT NULL 约束要使用 MODIFY 语句

添加约束
    ALTER TABLE     employees
    ADD CONSTRAINT  emp_manager_fk --(emp_manager_fk 外键名称)
    FOREIGN KEY(manager_id) 
    REFERENCES employees(employee_id);
    
删除约束
    ALTER TABLE      employees
    DROP CONSTRAINT  emp_manager_fk;
    
无效化约束
    ALTER TABLE     employees
    DISABLE CONSTRAINT  emp_emp_id_pk;

激活约束
ALTER TABLE     employees
ENABLE CONSTRAINT   emp_emp_id_pk;
Table altered.
当定义或激活UNIQUE 或 PRIMARY KEY 约束时系统会自动创建UNIQUE 或 PRIMARY KEY索引

查询约束
查询数据字典视图 USER_CONSTRAINTS

SELECT  constraint_name, constraint_type,
    search_condition
FROM    user_constraints
WHERE   table_name = 'EMPLOYEES';

查询定义约束的列
    查询数据字典视图 USER_CONS_COLUMNS

常见的数据库对象
对象      描述
表       基本的数据存储集合,由行和列组成。
视图      从表中抽出的逻辑上相关的数据集合。
序列      提供有规律的数值。
索引      提高查询的效率
同义词     给对象起别名

视  图
    视图是一种虚表。 
    视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。
    向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的 SELECT 语句. 
    视图向用户提供基表数据的另一种表现形式
    
   
为什么使用视图
    控制数据访问
    简化查询
    避免重复访问相同的数据
    
简单视图和复杂视图   
特性          简单视图           复杂视图
表的数量        一个        一个或多个
函数            没有            有
分组            没有            有
DML 操作        可以          有时可以

创建视图
    在 CREATE VIEW 语句中嵌入子查询
    子查询可以是复杂的 SELECT 语句

    create or replace view empview 
    as 
    select employee_id emp_id,last_name name,department_name
    from employees e,departments d
    Where e.department_id = d.department_id
    
创建视图
    创建视图时在子查询中给列定义别名
    在选择视图中的列时应使用别名
    CREATE VIEW     salvu50
 AS SELECT  employee_id ID_NUMBER, last_name NAME,
            salary*12 ANN_SALARY
    FROM    employees
    WHERE   department_id = 50;

查询视图
    SELECT *
FROM    salvu50;

修改视图
    使用CREATE OR REPLACE VIEW 子句修改视图
    CREATE VIEW 子句中各列的别名应和子查询中各列相对应
    CREATE OR REPLACE VIEW empvu80
  (id_number, name, sal, department_id)
AS SELECT  employee_id, first_name || ' ' || last_name, 
           salary, department_id
   FROM    employees
   WHERE   department_id = 80;
   
视图中使用DML的规定
    可以在简单视图中执行 DML 操作
    当视图定义中包含以下元素之一时不能使用delete:
    组函数
    GROUP BY 子句
    DISTINCT 关键字
    ROWNUM 伪列
    create or replace view sal_view
    as select
    avg(salary) avg_sal from employees
    group by department_id

屏蔽 DML 操作
    可以使用 WITH READ ONLY 选项屏蔽对视图的DML 操作
    任何 DML 操作都会返回一个Oracle server 错误
    CREATE OR REPLACE VIEW empvu10
    (employee_number, employee_name, job_title)
AS SELECT   employee_id, last_name, job_id
   FROM     employees
   WHERE    department_id = 10
   WITH READ ONLY;
   
删除视图
    删除视图只是删除视图的定义,并不会删除基表
的数据
    DROP VIEW view;
    DROP VIEW empvu80;

Top-N 分析
    查询工资最高的三名员工:
    SELECT ROWNUM as RANK, last_name, salary 
FROM  (SELECT last_name,salary FROM employees
       ORDER BY salary DESC)
WHERE ROWNUM <= 3;


常见的数据库对象
对象          描述

表            基本的数据存储集合,由行和列组成。

视图          从表中抽出的逻辑上相关的数据集合。

序列          提供有规律的数值。
索引          提高查询的效率
同义词         给对象起别名


什么是序列?
序列: 可供多个用户用来产生唯一数值的数据库对象
    自动提供唯一的数值
    共享对象
    主要用于提供主键值
    将序列值装入内存可以提高访问效率
    
CREATE SEQUENCE 语句

    CREATE SEQUENCE sequence
       [INCREMENT BY n]  --每次增长的数值
       [START WITH n]    --从哪个值开始
       [{MAXVALUE n | NOMAXVALUE}]
       [{MINVALUE n | NOMINVALUE}]
       [{CYCLE | NOCYCLE}]     --是否需要循环
       [{CACHE n | NOCACHE}];  --是否缓存登录
       
创建序列
创建序列 DEPT_DEPTID_SEQ为表 DEPARTMENTS 提供主键
不使用 CYCLE 选项
    CREATE SEQUENCE dept_deptid_seq
                INCREMENT BY 10
                START WITH 120
                MAXVALUE 9999
                NOCACHE
                NOCYCLE;

查询序列
查询数据字典视图 USER_SEQUENCES 获取序列定义信息
如果指定NOCACHE 选项,则列LAST_NUMBER 显示序列中下一个有效的值
SELECT  sequence_name, min_value, max_value, 
    increment_by, last_number
FROM    user_sequences;

NEXTVAL 和 CURRVAL 伪列
    NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用
    CURRVAL 中存放序列的当前值 
    NEXTVAL 应在 CURRVAL 之前指定 ,否则会报CURRVAL 尚未在此会话中定义的错误。
    
使用序列
    将序列值装入内存可提高访问效率
    序列在下列情况下出现裂缝:
        回滚
        系统异常
        多个表同时使用同一序列
    如果不将序列的值装入内存(NOCACHE), 可使用表 USER_SEQUENCES 查看序列当前的有效值

修改序列
修改序列的增量, 最大值, 最小值, 循环选项, 或是否装入内存
ALTER SEQUENCE dept_deptid_seq
               INCREMENT BY 20
               MAXVALUE 999999
               NOCACHE
               NOCYCLE;

删除序列
    使用 DROP SEQUENCE 语句删除序列
    删除之后,序列不能再次被引用
    
索  引
    一种独立于表的模式对象, 可以存储在与表不同的磁盘或表空间中
    索引被删除或损坏, 不会对表产生影响, 其影响的只是查询的速度
    索引一旦建立, Oracle 管理系统会对其进行自动维护, 而且由 Oracle 管理系统决定何时使用索引。用户不用在查询语句中指定使用哪个索引
    在删除一个表时,所有基于该表的索引会自动被删除
    通过指针加速 Oracle 服务器的查询速度
    通过快速定位数据的方法,减少磁盘 I/O
    
创建索引
    自动创建: 在定义 PRIMARY KEY 或 UNIQUE 约束后系统自动在相应的列上创建唯一性索引
手动创建: 用户可以在其它列上创建非唯一的索引,以加速查询

创建索引
在一个或多个列上创建索引
在表 EMPLOYEES的列 LAST_NAME 上创建索引
CREATE INDEX    emp_last_name_idx
ON      employees(last_name);
Index created.

什么时候创建索引
    以下情况可以创建索引:
    列中数据值分布范围很广
    列经常在 WHERE 子句或连接条件中出现
    表经常被访问而且数据量很大 ,访问的数据大概占数据总量的2%到4%

什么时候不要创建索引
    表很小
    列不经常作为连接条件或出现在WHERE子句中
    查询的数据大于2%到4%
    表经常更新
索引不需要用,只是说我们在用name进行查询的时候,速度会更快。当然查的速度快了,插入的速度就会慢。因为插入数据的同时,还需要维护一个索引。


查询索引
可以使用数据字典视图 USER_INDEXES 和 USER_IND_COLUMNS 查看索引的信息
    SELECT  ic.index_name, ic.column_name,
    ic.column_position col_pos,ix.uniqueness
FROM    user_indexes ix, user_ind_columns ic
WHERE   ic.index_name = ix.index_name
AND ic.table_name = 'EMPLOYEES';

删除索引
使用DROP INDEX 命令删除索引
删除索引UPPER_LAST_NAME_IDX
只有索引的拥有者或拥有DROP ANY INDEX 权限的用户才可以删除索引
删除操作是不可回滚的
    DROP INDEX index;
    DROP INDEX upper_last_name_idx;
Index dropped.

同义词-synonym
    使用同义词访问相同的对象:
    方便访问其它用户的对象
    缩短对象名字的长度
CREATE SYNONYM e FOR employees;
select * from e;

创建和删除同义词
为视图DEPT_SUM_VU 创建同义词
    CREATE SYNONYM  d_sum
FOR  dept_sum_vu;

删除同义词
DROP SYNONYM d_sum;



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348