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

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

--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对象中的一个同名对象

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

创建和删除时所需的权限

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

四、更多

Oracle 用户、对象权限、系统权限

SQL 基础--> ROLLUP与CUBE运算符实现数据汇总

SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)

SQL 基础--> 视图(CREATE VIEW)

Oracle 常用目录结构(10g)

五、如转载,请注明出处。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何管理SQL数据库

安装SQL数据库时,需要添加,修改,删除和查询数据所需的所有命令。这个备忘单样式指南提供了一些最常用的SQL命令的快速参考。

27820
来自专栏张善友的专栏

Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft ...

37080
来自专栏大数据和云计算技术

MongoDB系列6:MongoDB索引的介绍

1、前言 和关系型数据库一样,MongoDB的索引可以提高查询执行效率。索引就好比书中的目录,可以快速定位书中某一页。适当的索引查询,优化器可以快速地返回结果集...

568100
来自专栏java一日一条

InnoDB引擎算法和优化

索引是应用程序设计和开发的一个重要方面。如果索引太多,应用的性能可能会受到影响;如果索引太少,对查询性能又会产生影响。

12010
来自专栏osc同步分享-java技术分享站

数据库

1.分组查询 -- 查询选修三门课以上的学生的学号 select Sno from SC group by Sno having count(*)>3; 2.修...

29980
来自专栏乐沙弥的世界

SQL Tuning Advisor(STA) 到底做了什么?

      SQL Tuing Advisor(STA) 是Automatic Tuning Optimizer(自动优化调整器)的一部分。在前面的文章使用SQ...

12840
来自专栏性能与架构

Mysql Join的实现原理

在MySQL中,只有一种Join算法,就是大名鼎鼎的NestedLoop Join 对左表进行遍历,拿一条数据和右表的每条数据进行比对,如果找到N条匹配的,此条...

46560
来自专栏葡萄城控件技术团队

Table-values parameter(TVP)系列之一:在T-SQL中创建和使用TVP

一.摘要   表值参数(Table-valued parameters)简称TVP,是SQL Server 2008中引入的一种新特性,它提供了一种内置的方式...

28990
来自专栏岑玉海

SqlServer 索引

什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K 。为了加快查...

43190
来自专栏Kevin-ZhangCG

SQL优化总结之一

30550

扫码关注云+社区

领取腾讯云代金券