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)

 

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

时间: 2024-09-18 03:25:56

SQL基础--> 序列(SEQUENCE)、同义词(SYNONYM)的相关文章

SQL基础12—— 序列(SEQUENCE)、同义词(SYNONYM)

一.序列     是一个Oracle对象,提供唯一的数字,在需要时根据指定的增量值来递增,通常用于产生主键值     类似于SQL server中的IDENTITY(int,1,1) 或者列为IDENTITY列.SQL server可以直接将列指定     为IDENTITY列,在使用的时候可以不需要理会IDENTITY列,系统会自动递增,这样看来SQL     server 中主键的产生更为简便.         1.序列的特性:        自动提供唯一的数值        共享对象   

SQL基础--> 约束(CONSTRAINT)

--============================= --SQL基础--> 约束(CONSTRAINT) --=============================   一.几类数据完整性     实体完整性:表中记录不重复(任何两条记录不全等)并且每条记录都有一个非空主键     域完整性:表中字段值必须与字段数据类型.格式.有效范围相吻合     参照完整性:不能引用不存在的值     自定义完整性:根据特定业务领域定义的需求完整性         保证数据完整性的几种常用方法

《MySQL DBA修炼之道》——3.3 SQL基础

3.3 SQL基础 SQL是一种高级查询语言,它是声明式的,也就是说,只需要描述希望怎么获取数据,而不用考虑具体的算法实现.3.3.1 变量 MySQL里的变量可分为用户变量和系统变量.1.用户变量 用户变量与连接有关.也就是说,一个客户端定义的变量不能被其他客户端看到或使用.当客户端退出时,该客户端连接的所有变量将自动释放.这点不同于在函数或存储过程中通过DECLARE语句声明的局部变量,局部变量的生存周期在它被声明的"BEGIN-END"块内.对于用户变量的值,可以先保存在用户变量

SQL 基础-->创建和管理表

--================================= --SQL 基础-->创建和管理表 --=================================   一.创建表:create table     1.语法:CREATE TABLE  [ 用户名. ] 表名          (列名 数据类型 [ default 默认值] [ 约束条件]  [ , ......]  )         TABLESPACE 表空间名       2.表名和列名命名规则:     

Python基础03 序列

原文:Python基础03 序列 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!  谢谢thunder424纠错   sequence 序列 sequence(序列)是一组有顺序的元素的集合 (严格的说,是对象的集合,但鉴于我们还没有引入"对象"概念,暂时说元素)   序列可以包含一个或多个元素,也可以没有任何元素. 我们之前所说的基本数据类型,都可以作为序列的元素.元素还可以是另一个序列,以及我们以后要介绍的其他对

SQL 基础11——创建和管理表

一.创建表:create table     1.语法:CREATE TABLE  [ 用户名. ] 表名          (列名 数据类型 [ default 默认值] [ 约束条件]  [ , ......]  )         TABLESPACE 表空间名       2.表名和列名命名规则:        必须以字母开头        必须在1–个字符之间        必须只能包含A–Z, a–z, 0–, _, $, 和#        必须不能和用户定义的其他对象重名    

Oracle中使用触发器(trigger)和序列(sequence)模拟实现自增列实例_oracle

问题:在SQL Server数据库中,有自增列这个字段属性,使用起来也是很方便的.而在Oracle中却没有这个功能,该如何实现呢? 答:在Oracle中虽然没有自增列的说法,但却可以通过触发器(trigger)和序列(sequence)来模式实现. 示例: 1.建立表 复制代码 代码如下: create table user  (       id   number(6) not null,       name   varchar2(30)   not null primary key  ) 

sql-菜鸟求助SQL基础问题,在线等

问题描述 菜鸟求助SQL基础问题,在线等 不是主键只能有一个吗?怎么可以定义两个? 解决方案 这是联合主键,两个字段同时作为主键,这两个字段的组合在在数据表中是唯一,且加了主键索引. 解决方案二: 联合主键,我一般很少用到,原理和一个主键差不多,只不过他们两个联合起来是在表中唯一的 解决方案三: 有时候你需要同时用两个特征来作为主键来描述一个表的某个属性,往往包含具有唯一性的效果 解决方案四: 大家说的很清楚了,联合主键 解决方案五: 主键的作用是唯一区分不同的记录.主键可以由一个或者多个属性组

SQL基础

    第三部分  操作数据:SQL               本部分内容           n  SQL基础           n  中级SQL           n  高级SQL       第10章  SQL基础                      本章内容                             SQL介绍                  使用SELECT 语句从表中取数据                  创建新表                  字段