Oracle之序列及同义词

3.2序列(重点)
  
  在很多数据库系统中都存在一个自动增长的列,如果要在Oracle中完成自动增长的
  功能,则只能依靠序列完成,所有的自动增长操作,需要用户手工完成处理
  序列的创建格式:
  CREATE SEQUENCE sequence
  [INCREMENT BY n][START WHIT n]
  [{MAXVALUE n|NOMAXVALUE}]
  [{MINVALUE n|NOMINVALUE}]
  [{CYCLE|NOCYCLE}]
  [{CACHE n|NOCACHE}]
  我们先从基本的开始创建
  范例:创建一个基本序列;
  CREATE SEQUENCE myseq;序列已创建
  序列创建完成之后,所有的自动增长应该由用户自己处理,所以在序列中提供了一下的操作;
  nextVal:下一个值
  currVAL:当前序列值
  创建一个序列测试表
  范例:
  CREATE TABLE testseq(
   next NUMBER,
   curr NUMBER
  );
  添加数据,手工使用序列
   INSERT INTO testseq(next,curr)VALUES(myseq.nextval,myseq.currval);
   执行上述语句5次
   然后观察
   SELECT * FROM testseq;
   从结果中发现,nextval的内容始终在进行自动增长的操作,而currval使用取出
   当前操作的序列结果,也就是现在这种序列,每次的增幅是1.此时我们想
   更改增幅 可以使用以下的一个参数
   每次的增长幅度:[INCREMENT BY n]
   范例:重新建立序列(不能使用CREATE OR REPLACE命名)
   只能先删除重新创建序列
   删除序列:DROP SEQUENCE myseq;
   重新创建序列:CREATE SEQUENCE myseq INCREMENT BY 2;
   重新创建testseq测试序列表
   DROP TABLE testseq;
   CREATE TABLE testseq(
   next NUMBER,
   curr NUMBER
   );
   重新执行数据的插入,插入5次
   INSERT INTO testseq(next,curr)VALUES(myseq.nextval,myseq.currval);
   然后查询
   SELECT * FROM testseq;
   从结果可以得知 现在的序列是以2为增幅增长
   默认情况下,序列是从1开始的,那么可以使用[START WITH n]
   重新创建序列,让他从10开始增幅
   DROP SEQUENCE myseq;
   CREATE SEQUENCE myseq INCREMENT BY 2 START WITH 10;
   执行上面的测试表的操作
   DROP TABLE testseq;
   CREATE TABLE testseq(
   next NUMBER,
   curr NUMBER
   );
   INSERT INTO testseq(next,curr)VALUES(myseq.nextval,myseq.currval);
   (同样的操作只要打/按回车即可)
   然后再查询结果
   SELECT * FROM testseq;
   结果如我们期待的那样,默认的开始值1被替换成10了。
   范例:下面重新创建一个序列,让其取值固定在1,3,5,7,9循环的序列号
   DROP SEQUENCE myseq;
   CREATE SEQUENCE myseq MAXVALUE 10 START WITH 1 INCREMENT BY 2
    CACHE 2 CYCLE;
   执行上面的测试表的操作
   DROP TABLE testseq;
   CREATE TABLE testseq(
   next NUMBER,
   curr NUMBER
   );
   INSERT INTO testseq(next,curr)VALUES(myseq.nextval,myseq.currval);
   出入多次后观察结果,发现序列的内容现在是循环的操作,但是从实际来看
   序列使用最多的语法,CREATE SEQUENCE 序列名称。
   
   3.3同义词(了解只适合Oracle数据库)
    之前一直存在这样的一种查询语句:
    SELECT SYSDATE FROM DUAL;(查询系统信息)
    之前一直强调DUAL是一张虚拟表,那么虽然是虚拟表,可是此表到底是
    在哪里定义的呢?
    如果现在使用system连接数据库,查询一下此表是否属于system
    切换用户
    CONN system/magager(安装完数据库时候设置的密码)
    SELECT * FROM TAB WHERE TNAME='DUAL';
    查询所有表查无dual;
    我们在进入超级管理员sys用户中查询:
    CONN sys/change_on_install AS SYSDBA;
    SELECT * FROM TAB WHERE TNAME='DUAL';
    在sys下存在此表
    但是我在scott用户下能直接通过表名访问,正常情况下如果要访问不同用户
    的表要使用“用户名.表名称”;
    在sys用户下使用下列SQL语句
    SELECT * FROM emp;
    发生错误:表或则视图不存在
    SELECT * FROM scott.emp;即可
    可见DUAL实际上是通过同义词发挥了作用,同义词可以让其他用户通过一个
    名称方便的访问“用户名.表名称”来访问其他用户下的表
    CREATE SYNONYM 同义词名称 FOR 用户名.表名称;
    范例:将scott用户下的emp表建立一个emp的同义词,然后在sys用户喜爱
    通过同义词查询
    CREATE SYNONYM emp FOR scott.emp;
    SELECT * FROM emp;
    可以完成查询
    范例:删除emp的同义词
    DROP SYNONYM emp;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值