--=============================================

--SQL基础--> 序列(SEQUENCE)、同义词(SYNONYM)

--=============================================

一、序列

是一个Oracle对象,提供唯一的数字,在需要时根据指定的增量值来递增,通常用于产生主键值

类似于SQL server中的IDENTITY(int,1,1) 或者列为IDENTITY列。SQL server可以直接将列指定

为IDENTITY列,在使用的时候可以不需要理会IDENTITY列,系统会自动递增,这样看来SQL

server 中主键的产生更为简便。

1.序列的特性:

自动提供唯一的数值

共享对象

主要用于提供主键值

代替应用代码

将序列值装入内存可以提高访问效率

2.CREATE SEQUENCE 语句定义序列:

CREATE SEQUENCE sequencename

[INCREMENT BY n]             定义序列增长步长,省略为1

[START WITH m]               序列起始值,省略为1

[{MAXVALUE n | NOMAXVALUE}] 序列最大值,NOMAXVALUE升序时,序列最大值的次方

降序时为-(默认也是为此)

[{MINVALUE n | NOMINVALUE}] 序列最小值,NOMINVALUE升序时,最小值为,降序时序列

最小值为-的次方(默认也是为此)

[{CYCLE | NOCYCLE}]         到达最大值或最小值后,继续产生序列(默认NOCYCLE)

[{CACHE n | NOCACHE}];       序列缓存与否(默认NOCACHE)

关于创建序列,使用序列所需要的权限请参考:Oracle 用户、对象权限、系统权限

--创建一个序列

SQL> CREATE SEQUENCE my_seq

2  INCREMENT BY 10

3  START WITH 100

4  MAXVALUE 150

5  NOCACHE

6  NOCYCLE;

Sequence created.

3.使用序列

NEXTVAL 和CURRVAL 伪列

NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用

CURRVAL 中存放序列的当前值

第一次使用时CURRVAL不能用

使用时需要指定序列的对象名

将序列值装入内存可提高访问效率

序列在下列情况下出现裂缝:

–回滚

–系统异常

–多个表同时使用同一序列

如果不将序列的值装入内存(NOCACHE), 可使用表USER_SEQUENCES 查看序列当前的有效值

--当第一次使用序列时指定了currval列,结果出现如下错误提示

SQL> SELECT my_seq.currval FROM dual;

SELECT my_seq.currval FROM dual

*

ERROR at line 1:

ORA-08002: sequence MY_SEQ.CURRVAL is not yet defined in this session

--使用nextval列,则成功执行,这就是NEXTVAL 必须在CURRVAL 之前指定,及第一次使用必须是NEXTVAL

SQL> SELECT my_seq.nextval FROM dual;

NEXTVAL

----------

100

SQL> SELECT my_seq.currval FROM dual;

CURRVAL

----------

100

4.查询序列

USER_SEQUENCES

DBA_SEQUENCES

ALL_SEQUENCES

查询数据字典视图USER_SEQUENCES获取序列定义信息

如果指定NOCACHE 选项,则列LAST_NUMBER 显示序列中下一个有效的值

SQL> SELECT sequence_name,min_value,max_value

2      increment_by,cycle_flag,order_flag,

3      cache_size,last_number

4  FROM user_sequences

5  WHERE sequence_name IN ('SEQ1','SEQ2','MY_SEQ');

SEQUENCE_NAME                   MIN_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER

------------------------------ ---------- ------------ - - ---------- -----------

MY_SEQ                                  1          150 N N          0         110

SEQ1                                    1          200 Y N          0         110

SEQ2                                    1          200 Y N          0          31

5.序列应用举例:

SQL> conn robinson/lion

Connected.

SQL> ALTER TABLE robinson.dept MODIFY(deptno NUMBER);

Table altered.

--出现了下面的错误,怀疑是授权的问题

SQL> INSERT INTO robinson.dept(deptno,dname,loc)

2  VALUES(my_seq.currval,'Customers','HongKong');

VALUES(my_seq.currval,'Customers','HongKong')

*

ERROR at line 2:

ORA-02289: sequence does not exist

--使用sys帐户授权成功

SQL> conn sys as sysdba

Enter password:

Connected.

SQL> GRANT ALL ON my_seq TO robinson;

Grant succeeded.

--查看权限已被成功授予

SQL> select grantee,owner,table_name,grantor,privilege from user_tab_privs;

GRANTEE    OWNER      TABLE_NAME    GRANTOR        PRIVILEGE

---------- ---------- ------------- -------------- --------------

ROBINSON   SCOTT      EMP           SCOTT          SELECT

ROBINSON   SYS        MY_SEQ        SYS            SELECT

ROBINSON   SYS        MY_SEQ        SYS            ALTER

--成功授权之后还是出现同样的提示

SQL> INSERT INTO robinson.dept(deptno,dname,loc)

2  VALUES(my_seq.currval,'Customers','HongKong');

VALUES(my_seq.currval,'Customers','HongKong')

*

ERROR at line 2:

ORA-02289: sequence does not exist

--在sequence名字前增加schema 为sys ,出现了如下提示

SQL> INSERT INTO robinson.dept(deptno,dname,loc)

2  VALUES(sys.my_seq.currval,'Customers','HongKong');

VALUES(sys.my_seq.currval,'Customers','HongKong')

*

ERROR at line 2:

ORA-08002: sequence MY_SEQ.CURRVAL is not yet defined in this session

--修改currval为nextval,操作成功

SQL> INSERT INTO robinson.dept(deptno,dname,loc)

2  VALUES(sys.my_seq.nextval,'Customers','HongKong');

1 row created.

SQL> SELECT * FROM dept;

DEPTNO DNAME          LOC

---------- -------------- -------------

10 ACCOUNTING     NEW YORK

20 RESEARCH       DALLAS

30 SALES          CHICAGO

40 OPERATIONS     BOSTON

110 Customers      HongKong

--第二次使用currval可以成功执行,因该表未设置主键,故未提示冲突

SQL> INSERT INTO robinson.dept(deptno,dname,loc)

2  VALUES(sys.my_seq.currval,'Customers','HongKong');

1 row created.

SQL> SELECT * FROM dept;

DEPTNO DNAME          LOC

---------- -------------- -------------

10 ACCOUNTING     NEW YORK

20 RESEARCH       DALLAS

30 SALES          CHICAGO

40 OPERATIONS     BOSTON

110 Customers      HongKong

110 Customers      HongKong

6.修改序列

修改序列的增量, 最大值, 最小值, 循环选项, 或是否装入内存

修改序列的注意事项

必须是序列的拥有者或对序列有ALTER 权限

只有将来的序列值会被改变

改变序列的初始值只能通过删除序列之后重建序列的方法实现

其它的一些限制

SQL> ALTER SEQUENCE my_seq

2  INCREMENT BY 20

3  MAXVALUE 160

4  CYCLE;

Sequence altered

--注意当序列值达到最大值后,其初始值变成了,但增量值不会发生变,如下面的例子

SQL> select sys.my_seq.nextval from dual;

NEXTVAL

----------

130

SQL> /

NEXTVAL

----------

150

SQL> /    --此时序列值变成了

NEXTVAL

----------

1

SQL> /   --此时序列值按作为增量值,所以结果为

NEXTVAL

----------

21

7.删除序列

使用DROP SEQUENCE 语句删除序列

删除之后,序列不能再次被引用

SQL> DROP SEQUENCE sys.my_seq;

DROP SEQUENCE sys.my_seq

*

ERROR at line 1:

ORA-01031: insufficient privileges

SQL> CONN sys as sysdba

Enter password:

Connected.

SQL> DROP SEQUENCE my_seq;

Sequence dropped

8.创建序列的详细语法:CREATE SEQUENCE

二、同义词

是Oracle对象的别名,使用同义词访问相同的对象

可以为表、视图、存储过程、函数或另一同义词等对象创建同义词

方便访问其它用户的对象,隐藏了对象的身份

缩短对象名字的长度

1.创建同义词的权限

CREATE ANY SYNONYM

CREATE PUBLIC SYNONYM

2.创建同义词

CREATE [PUBLIC] SYNONYM synonym_name  FOR  object;

3.查看同义词

DBA_OBJECTS

DBA_SYNONYMS

USER_SYNONYMS

--查看系统同义词

SQL> SELECT object_name,object_type,created,status FROM dba_objects

2  WHERE object_name='S';

SQL> SELECT OWNER,SYNONYM_NAME,TABLE_OWNER,TABLE_NAME

2  FROM dba_synonyms;

4.删除同义词

DROP SYNONYM synonymname

所需权限

DROP PUBLIC SYNONYM

DROP ANY SYNONYM

5.同义词应用举例

--演示使用scoot帐户创建公共同义词

SQL> SHOW USER;

USER is "SCOTT"

SQL> CREATE PUBLIC SYNONYM DEPARTMENT FOR scott.dept;

Synonym created.

--robinson帐户访问同义词DEPARTMENT

SQL> CONN robinson/lion; --注意此处robinson必须对scott.dept具有select权限,否则访问DEPARTMENT不成功

Connected.

SQL> SELECT * FROM DEPARTMENT;

DEPTNO DNAME          LOC

---------- -------------- -------------

10 ACCOUNTING     NEW YORK

20 RESEARCH       DALLAS

30 SALES          CHICAGO

40 OPERATIONS     BOSTON

SQL> CONN scott/tiger;

Connected.

--对于创建的公共同义词没有出现在user_synonyms视图中

SQL> SELECT synonym_name,table_owner,table_name FROM user_synonyms;

no rows selected

--scott 再次为同一个对象创建一个私有同义词,且与公共同义词同名,并没有报错

SQL> CREATE SYNONYM DEPARTMENT FOR scott.dept;

Synonym created.

--scott再次查看同义词视图中有一条记录,则该记录为私有同义词

SQL> SELECT synonym_name,table_owner,table_name FROM user_synonyms;

SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME

------------------------------ ------------------------------ ------------------------------

DEPARTMENT                     SCOTT                          DEPT

--使用sys帐户查看为条记录,一条为私有,一条为公共,哪条为公,哪条为私,不太好区分

SQL> CONN sys as sysdba;

Enter password:

Connected.

SQL> SELECT synonym_name,table_owner,table_name FROM dba_synonyms

2  WHERE table_name = 'DEPT';

SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME

------------------------------ ------------------------------ ------------------------------

DEPARTMENT                     SCOTT                          DEPT

DEPARTMENT                     SCOTT                          DEPT

--scott用户登陆后删除公共同义词,提示权限不够

SQL> DROP PUBLIC SYNONYM DEPARTMENT;

DROP PUBLIC SYNONYM DEPARTMENT

*

ERROR at line 1:

ORA-01031: insufficient privileges

--为scott授予删除同义词的权限

SQL> CONN sys as sysdba;

Enter password:

Connected.

SQL> GRANT DROP ANY SYNONYM ,DROP PUBLIC SYNONYM TO scott;

Grant succeeded.

--scott 成功删除同义词

SQL> CONN scott/tiger;

Connected.

SQL> DROP PUBLIC SYNONYM DEPARTMENT;

Synonym dropped.

--删除公共同义词后robinson不可访问

SQL> CONN robinson/lion;

Connected.

SQL> SELECT * FROM DEPARTMENT;

SELECT * FROM DEPARTMENT

*

ERROR at line 1:

ORA-00942: table or view does not exist

--scott对于私有的同义词仍然可以使用

SQL> conn scott/tiger;

Connected.

SQL> SELECT * FROM DEPARTMENT;

DEPTNO DNAME          LOC

---------- -------------- -------------

10 ACCOUNTING     NEW YORK

20 RESEARCH       DALLAS

30 SALES          CHICAGO

40 OPERATIONS     BOSTON

--最后删掉私有同义词

SQL> DROP SYNONYM DEPARTMENT;

Synonym dropped.

6.创建同义词的详细语法:CREATE SYNONYM

三、总结:

序列

主要用于产生主键值

创建删除时所需的权限

关于sequence_name.nextval与sequence_name.currval的使用,nextval优先于currval使用

对于不同用户创建的序列,使用时需要带上schema,如scott.seq1.nextval

对于循环使用序列,当达到最大值后,初始值为

同义词

是Oracle对象中的一个同名对象

可以分为公共同义词和私有同义词,两者可同名

创建和删除时所需的权限

对于同义词的访问,需要对原始对象具有适当的权限,否则同义词不可用

四、更多

序列(SEQUENCE)、同义词(SYNONYM)相关推荐

  1. Oracle数据库之对象视图、索引、序列、同义词

    Oracle数据库总结: Oracle数据库之集合运算 Oracle数据库之数据处理 Oracle数据库之建表和管理表 Oracle数据库之对象视图.索引.序列.同义词 视图: 语法: create ...

  2. 详解:Oracle 数据库空间表、自定义用户、权限管理、序列、同义词、索引

    一:数据库空间表 表空间是数据库逻辑结构的一个重要组件,可以存放各种应用对象,如表.索引.每一个表空间由一个或多个数据文件组成. 表空间分类: 1.永久性表空间 一般保存表.视图.过程和索引等的数据. ...

  3. Oracle中的序列,同义词

    Oracle中的序列,同义词 2006年08月18日 星期五 下午 01:51 什么叫序列:     1:定义:         仅向前的数字变量(和SQL中的自动编号有点像 identity(1,2 ...

  4. Oracle数据库的视图、物化视图、序列、同义词、索引

    Oracle数据库对象 视图 物化视图 序列 同义词 索引 注:以下数据库对象中, 物化视图.序列.同义词为Oracle数据库特有 视图 含义:视图是一种数据库对象,是从一个或者多个数据表或视图中导出 ...

  5. Oracle数据库之同义词(SYNONYM)使用

    本教程用示例来说明在Oracle数据中如何创建和删除同义词(SYNONYM). 概念 同义词是指数据库对象(表.视图.序列.存储过程等数据库对象)用另一个名字来引用.比如: 建立一个同义词可以排除一个 ...

  6. oracle 视图、索引、序列、同义词

    目录 1.视图对象 1.1创建视图 1)简单视图 2)建立只读视图 3)复杂视图 1.2管理视图 1)查看视图定义 2)修改视图定义 3)重新编译视图 4)删除视图 2.索引 2.1索引概述 2.2创 ...

  7. Oracle数据库:创建、修改、删除、使用同义词synonym和索引index

    Oracle数据库:创建.修改.删除.使用同义词synonym和索引index 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得 ...

  8. oracle vs. SQL 同义词synonym 别名 alias

    oracle 同义词 synonym 为数据库对象建立同义词后,当dba对数据库对象(table,view,序列)做了一个简单改动之后,如名字或者结构改变,则不需要重新更改并编译应用.在数据库字典中有 ...

  9. Oracle 同义词synonym

    (1)同义词概念 同义词顾名思义,是数据库方案对象的一个别名.这里的数据库方案对象指表.视图.序列.存储过程.包等. (2)同义词类型 私有同义词synonym只能在其模式内访问,不能与模式内对象同名 ...

最新文章

  1. 并发编程12-显示锁
  2. ios数组基本用法和排序
  3. AUTOSAR从入门到精通100讲(三)-基于UDS服务的BootLoader架构和刷写流程
  4. 如何判断输入的是字符还是数字_[Leetgo]判断字符串是否为数字
  5. Spring中Bean管理操作基于XML配置文件方法实现
  6. pcie routing
  7. linux的基本的命令行操作
  8. 【优化调度】基于matlab粒子群算法求解水火电调度优化问题【含Matlab源码 1181期】
  9. 【是程序猿就干了这碗心灵鸡汤】我们这一代人的困惑
  10. IDEA 创建类注释模板
  11. 沧小海读《图解TCP/IP》笔记——第一章 网络基础知识
  12. 获取windows硬件、软件信息的方法
  13. 创建线程的三种方式、线程运行原理、常见方法、线程状态
  14. 图表点编辑数据无反应_我快疯了!为什么我的excel里的图表不能编辑数据!
  15. 摄影入门-之一-什么是单反
  16. 安装 Windows XP 时出现错误信息“STOP:c0000218 {Registry File Failure}”(STOP: c0000218 {注册表文件失败})
  17. 世界上最惨烈的股市大崩盘
  18. “开心消消乐”系列资源解包
  19. 划片机在测高过程中发生异常如何自查
  20. 26岁学历低的我,是如何从工厂转行Python工程师?

热门文章

  1. [转载] 可疑的成功
  2. 微信小程序-登录(wx.login)
  3. 【rviz】出现“For frame [laser]: Fixed Frame [map] does not exist”错误
  4. ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘()
  5. Python练手项目:用中国地图验证四色地理
  6. 无固定公网IP,群晖动态解析域名到动态公网IP
  7. vue拖拽盒子;vue移动
  8. Python OpenCV 裁剪身份证正反面
  9. OpenCV中LBPH人脸识别器识别人脸实战(附Python源码)
  10. CSS简介代码实现表格(table)只有横线没有竖线的效果,一个简约卡片化精美的数据表格(类似Bootstrap表格)