分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
--=============================================
--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.修改序列
修改序列的增量, 最大值, 最小值, 循环选项