zoukankan      html  css  js  c++  java
  • 【Oracle】进阶知识进一步了解

    约束

    非空约束(NOT NULL, NK)

    CREATE TABLE 表名称(
    列名 数据类型,
    列名 数据类型 NOT NULL 
    )

    唯一约束(UNIQUE KEY, UK)

    CREATE TABLE 表名称(
    列名 数据类型,
    列名 数据类型,
    CONSTRAINT 约束名 UNIQUE(列名)
    )

    主键约束(PRIMARY KEY, PK)

    主键约束 = 非空约束 + 唯一约束

    CREATE TABLE 表名称(
    列名 数据类型,
    列名 数据类型,
    CONSTRAINT 约束名 PRIMARY KEY(列名)
    )

    检查约束(CHECK KEY, CK)

    CREATE TABLE 表名称(
    列名 数据类型,
    列名 数据类型,
    CONSTRAINT 约束名 CHECK(列名 条件)
    )

    主-外键约束(FOREIGN KEY,FK)

    子表的某个字段应该与父表的主键或唯一约束的字段有关联

    CREATE TABLE 表名称(
    列名 数据类型,
    列名 数据类型,
    CONSTRAINT 约束名 FOREIGN KEY(列名) REFERENCES 表名(列名)
    )
    
    • 限制一:在删除主表之前,请一定要保证先删除子表。所以在删除数据表的时候应该先删除子表后再删除父表。
    • 限制二:作为外键的字段在主表之中必须具备主键约束或者是唯一约束
    • 数据的级联操作问题
      • 在删除主表数据的时候,如果存在有相应的子表数据,那么主表数据无法被删除
      • 为了方便数据的删除,提供有一个级联删除操作,在主表数据删除的时候对应的子表数据会同时删除掉,在建立 外键的时候使用 ON DELETE CASCADE 来设置。
      • 如果在删除主表数据的时候不希望子表数据被一起删除掉,则可以使用级联更新操作,使用 ON DELETE SET NULL 来设置。
     

    修改约束

    增加约束

    此类的语法适合于唯一、主键、检查、外键约束的添加,而无法添加非空约束

    ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(约束字段) [选项] ;
    

    删除约束

    ALTER TABLE 表名称 DROP CONSTRAINT 约束名称
     
     
     

    序列

    创建序列

    CREATE SEQUENCE 序列名称 
    [INCREMENT BY 步长] [START WITH 开始值]
    [MAXVALUE 最大值 | NOMAXVALUE]
    [MINVALUE 最小值 | NOMINVALUE] [CYCLE | NOCYCLE] [CACHE 缓存大小 |NOCACHE]

     序列的数字字典为user_sequences

    在此数据字典之中主要包含如下列的数据信息:

    • SEQUENCE_NAME:表示的序列名称,本处为 MYSEQ;
    • MIN_VALUE:表示序列的最小值,默认的序列最小值是 1;
    • MAX_VALUE:表示序列的最大值,默认序列是没有最大值,1028 已经很大了。
    • NCREMENT_BY:步长,每次增长的数据,默认的是 1;
    • CYCLE:是否为循环序列,如果是 N 表示非循环,如果是 Y 表示循环;
    • ORDER:表示序列是否排序;
    • CACHE_SIZE:序列的缓存数据;
    • LAST_NUMBER:序列最后一次的增长值。
     

    当一个序列对象已经创建完成之后,那么下面就可以采用如下的两个伪列来进行序列的控制 

    • 取得序列下一个增长数据(每次调用序列值都增长指定的步长):序列.nextval;
    • 取得序列的当前数据(每次调用序列都不增长):序列.currval;
    • 在使用 currval 之前一定要首先使用 nextval,否则会出现“ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此会话中定义”。 

    视图

    创建视图

    CREATE [OR REPLACE] VIEW 视图名 AS 子查询
    [WITH CHECK OPTIONI][WITH REA ONLY]

    注意:从 Oracle 10g R2 版本之后出现了一个创建视图的权限问题,在这之前,scott 用户本身是具备有创建视图权限的, 但是之后就没有了,那么下面首先执行如下的语句,来实现权限的分配: 

    CONN sys/change_on_install AS SYSDBA ; 
    GRANT CREATE VIEW TO scott ;
    CONN scott/tiger ;
    
    • 避免视图创建条件更新:WITHCHECK OPTION
    • 设置只读视图:WITHREAD ONLY 

    注意:WITHCHECK OPTION执行更新的指令,会出现“ORA-01402: 视图 WITH CHECK OPTION where 子句违规”错误提示信息, 直接告诉用户不能够更新视图的创建条件。

    使用 WITH CHECK OPTION 子句只能够保护视图的创建条件,但是其它的字段依然允许更新,这就可以使用WITH READ ONLY限制编辑操作。

    同义词

    创建同义词

    同义词创建必须是管理员。用public可以让所有用户都使用该同义词,反之只能sys下使用

    CREATE [PUBLIC] SYNONYM 同义词名称 FOR 用户名.表名称
    

      

    索引

    A1:为什要用索引?

    Q1:假设现在 emp 表之中存在有 50W 条记录,而在第 20W 条记录之后就不会再有满足条件的数据了(sal>3000),但是 如果是全表扫描,意味着,要继续查询后面的 30W 行记录,而且都是逐行扫描(逐行判断),那么性能一定不能高。那么我们可以通过“树”的形式保存排序数据。

    A2:既然要排序,为什么不用ORDER BY呢?

    Q2:sql的执行顺序是from》where》select》order by。

    树的结构右大左小

    索引创建完成。随后再次进行 sal 查询的时候显示的不再是全表扫描,而是根据一个基数扫描。那么通过索引的 查询可以明显的提升查询性能,而索引实现的关键是这棵树的维护(树是由 Oracle 内部自行维护的)。那么继续以本程序 为例,如果说此时修改了某些雇员的工资呢?那么这棵树一定要发生变化,所有的数据都需要重新排列。那么此时配置的 索引不仅没有提升性能,反而降低了性能,所以索引是一种相对的手段,而且永恒都要记住,没有绝对的性能提升 途 径 。

    思考题:现在有一个新闻的检索数据库,里面保存了全世界大概有 100 亿条的数据,但是此数据库由于信息的维护的问题, 所以每秒种都会发出 10 ~ 20 次的更新指令,但是为了保证查询的性能又需要设置索引,请问,你该如何设计此数据库, 以达到查询性能优秀,更新的影响又降低到最小?

    • 矛盾点:如果要想提升查询性能只能够使用索引,但是如果频繁更新,所以又会出现性能严重降低。
    • 在所有的设计上只有一个原则:“以时间换空间、以空间换时间”。可以准备出两张表、一张表作为索引的数据查 询(表 A),另外一张表作为接收传入数据(表 B);
    • 白天所有的数据都保存在表 B 之中(这之中有可能包含有一些重复数据,或一些错误的数据),而在访问量小的 时候(1:00 ~ 7:00 访问量小)将一些新的数据保存在表 A 之中,而后给它充足的时间进行索引的生成。相当于牺牲了时实 性,但是提升了整体的操作性能,而这样的设计在很多地方都可以见到,例如:你们所有 App 的访问记录。或者最早 sina 的 blog 有一个访问统计。 

    单引号与双引号的区别

    双引号

    双引号的作用是:假如建立对象的时候,对象名、字段名加双引号,则示意Oracle将严格区分大小写,否则Oracl都默认大写。

    单引号

    • 用来引用一个字符串常量,也就是界定一个字符串的开始和结束
    • 转义符,对紧随其后出现的字符(单引号)进行转义
    • 表示它本身,也就是它作为一个字符串的一部分而出现在一个字符串常量中
  • 相关阅读:
    Netty之WebSocket和四种IO介绍
    java递归展示树形图代码实现以及遇到的问题
    String、String Buffer、String Builder
    物联网的开发应该是什么样子?
    最新 去掉 Chrome 新标签页的8个缩略图
    复化梯形求积分——用Python进行数值计算
    每日设置Bing首页图片为壁纸
    分段二次插值——用Python进行数值计算
    埃尔米特插值问题——用Python进行数值计算
    牛顿插值法——用Python进行数值计算
  • 原文地址:https://www.cnblogs.com/CSgarcia/p/11535988.html
Copyright © 2011-2022 走看看