提交和回滚记录

版权声明:--------- 版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/wangxw1803/article/details/85259951

提交更改

事务主要用来确保数据的一致性。任何三方失败都会导致数据的不一致,事务提供了一致性的机制,只要三方全部成功完成,操作便成功,所做的更改统一写回数据库,否则操作失败,用户所做的更改全部撤销。
事务提供了更改数据时更令狐德控制能力,可以在任何情况下确保数据的一致性。Oracle在遇到第一个DML语句时,事务被隐式地开始,一般情况下,只有调用COMMIT或ROLLBACK语句时,事务才能结束。当一个事务结束后,下一个可执行的SQL语句会自动执行下一个事务处理。

回滚更改

在执行DML语句开始下一个事务时,Oracle会将旧的数据保存到回退空间(UNDO TABLESPACE)中,以便用户可以使用ROLLBACK语句进行撤销。
当用户调用ROLLBACK后,Oracle会将回退表空间中的数据写道数据段中,以便取消DML语句的操作。

使用序列

在创建数据库表时,大多数数据库系统规划建议时使用一个无意义的、可自增长的字段作为主键。Oracle使用序列来产生唯一数字

序列

Oracle的序列是一种数据库对象,其主要工作是用来产生表示唯一值。序列被创建后可以通过数据字典找到序列对象,因此序列可以被多个对象共享
序列的一个典型用途是创建一个主键的值,它对于每一行必须是唯一的。序列由Oracle内部程序产生并增加或减少。
在这里插入图片描述
从上图可以看出,序列号独立于表被存储和生成,因此,相同的序列可以被多个表使用。

创建数据序列

序列使用CREATE SEQUENCE语法进行创建,在创建语法中,可以指定序列的名称,序列的起始值与步进值等,其比本语法如下:

CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n  | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];

语法的基本含义:

  • sequence:指定序列的名称。
  • INCREMENT BY:用于定义序列的步长,默认为1;如果出现负值,则代表序列的值是按照步长递减的
  • START WITH:定义序列的初始值,默认为1
  • MAXVALUE:定义序列生成器能产生的最大值;NOMAXVALUE是默认选项,表示没有定义最大值,这时对递增序列能产生的最大值是10的27次方;对于递减序列,最大值是-1
  • MINVALUE:定义序列生成器能产生的最小值,NOMINVALUE是默认选项,表示没有定义最小值,这时对递增序列能产生的最小值是10的26次方,对于递增序列,最小值是1
  • CYCLE 和NOCYCLE:表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值后,循环到最小值,对于递减序列,达到最小值时,循环到最大值;如果不循环,达到最大限制后,继续产生新值就会产生错误
  • CACHE(缓冲):定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列性能。
    创建序列
CREATE SEQUENCE invoice_seq
INCREMENT BY 1
START WITH 1
MAXVALUE 9999999
NOCYCLE NOCACHE;

invoice_seq序列从1开始累加,步进值为1,最大值为9999999,不循环,不缓存
注:如果序列用于产生主键值,不建议使用cycle选项
在user_sequences表中保存了序列明细信息,查询语句

SELECT sequence_name, min_value, max_value, increment_by, last_number
FROM user_sequences;

在这里插入图片描述

NEXTVAL和CURRVAL伪列

每个序列都具有两个伪列用来允许使用序列的表来获取序列的值

  • NEXTVAL:返回下一个可用的序列值,每次返回一个唯一的被吸引用值,对不同用户也是如此
  • CURRVAL:获得当前的序列值
    NEXTVAL伪列用于从指定的序列中取回连续的序列属的下一个值。在使用该伪列时,必须用序列名限定NEXTVAL,例如sequence.NEXTVAL,当使用sequenc.NEXTVAL时,一个新的序列数被产生并且当前的序列数被放入CURRVAL。而CURRVAL伪列用于查阅用户刚才产生的序列数
    注:必须在CURRVAL可以被引用之前在当前用户的会话使用NEXTVAL产生一个序列数,与NEXTVAL类同,必须用序列名限定CURRVAL,当sequence.CURRVAL被引用时,最后返回个用户程序的值被显示
    因此对对于invoice_seq序列来说,在使用CURRVAL之前,必须先使用NEXTVAL初始化一次,否则Oracle将会弹出异常。
SELECT invoice_seq.NEXTVAL FROM DUAL;

SELECT invoice_seq.CURRVAL FROM DUAL;

每次使用NEXTVAL伪列时,Oracle会根据序列创建参数产生一个新的伪列,新的伪列被赋值给CURRVAL伪列。而查询CURRVAL时,不会产生新的序列。

使用数据序列

通常在表的主键列中使用一个整数类型,然后在对表插入数据时,使用序列产生新的记录唯一性编号。

--建表
CREATE TABLE INVOICES
(
	invoice_id NUMBER PRIMARY KEY,  
	vendor_id NUMBER NOT NULL,  
	invoice_number VARCHAR2(50) NOT NULL,  
	invoice_date DATE DEFAULT SYSDATE,	
	invoice_total NUMBER(9,2) NOT NULL,
	payment_total NUMBER(9,2) DEFAULT 0
);
--插入记录
INSERT INTO INVOICES
	(INVOICE_ID,VENDOR_ID,INVOICE_NUMBER,INVOICE_TOTAL)
VALUES
	(invoice_seq.NEXTVAL,10,'INV'||invoice_seq.CURRVAL,100);

查询

SELECT INVOICE_ID, VENDOR_ID,INVOICE_NUMBER,INVOICE_TOTAL
FROM invoices;

在这里插入图片描述
使用NEXTVAL和CURRVAL的一些规则
可以在下面的上下文中使用NEXTVAL和CURRVAL

  • 不是子查询的一部分的SELECT语句的字段列表

  • INSERT语句中子查询的SELECT列表

  • INSERT与剧中的VALUES子句

  • UPDATE语句中SET子句
    不能在下面的上下文中使用NEXTVAL和CURRVAL

  • 视图的SELECT列表

  • 带DISTINCT关键字的SELECT语句

  • 带GROUP BY,HAVING或ORDER BY子句的SELECT语句

  • 在SELECT、DELETE、或UPDATE语句中的子句

  • 在CREATE TABLE或ALTER TABLE与剧中的DEFAULT表达式
    在使用序列时,可能会产生间隙,有多种原因,比如插入了一些记录,但是ROLLBACK了,序列值不会被回滚;查询了一个序列值,但是没有使用,这个序列值也丢失了;如果系统崩溃,或表使用相同的序列时,也容易产生序列间隙

修改序列

序列在使用一段时间后,可能需要修改序列,比如重新指定循环选项和缓存选项,修改增量值,最大值和最小值等。
修改序列的大部分参数的含义与创建序列类似,修改时限制

  • 不能改变序列的起始值,为了以不同的数字重新开始一个序列,必须先删除序列再重新创建
  • 序列的最小值不能大于序列的当前值
  • 序列的最大值不能小于序列的当前值
  • 修改后的序列规则不影响以前的序列值,只有未来的序列值会受到影响
  • 用户必须拥有ALTER SEQUENCE权限
ALTER SEQUENCE invoice_seq
INCREMENT BY 2;

删除序列

要删除序列,可以使用DROP SEQUENCE语句。该语句将序列从数据字典中删除,用户必须时要删除序列的所有者或具有DROP ANY SEQUENCE权限来删除这个序列

DROP SEQUENCE invoice_seq;

同义词

创建同义词的目的是简化对目标兑现过的访问,使用户易于查阅表的所有者,并且使对象的名字变短。同义词不占用实际存储空间,只是在数据字典中保存了同义词的定义

创建和使用同义词

CREATE PUBLIC SYNONYM semp
FOR scott.emp;
--PUBLIC:创建一个公共同义词,可以被所有用户访问
--SYNONYM:要被创建的同义词的名字。
--object:指出要创建同一侧的对象
SELECT * FROM semp;

猜你喜欢

转载自blog.csdn.net/wangxw1803/article/details/85259951