序列是Oracle数据库中一个命名的顺序编号生成器。这个编号生成器能够以串行方式生成一系列的顺序整数。这个特性在数据库开发的过程中,经常会遇到。如果没有这个工具的话,那么只能够在前台应用程序控制。这不仅会增加应用系统的开发工作量,而且对于并发访问的情况难以控制。如多个用户同时新建一张单据时,就很难保证单据编号的唯一。故Oracle数据库的顺序编号生成器是数据库开发工程师的左膀右臂,具有很大的实用价值。具体来说,他可以解决用户的如下几个需求。
需求一:流水号的需求。
在信息化管理系统中,很多地方需要用到流水号。如有些企业物料编码是按照流水号来编写的。原材料按前后顺序用六个数字来表示,每次新建一个后都递增1。再如一个商场的前台订单管理系统,每张订单的变码原则可能就是按年月日+流水号的方式构成,每张销售订单一个编号。当天的销售订单从“000001”开始,一张销售订单一个编号,而且编号都是累加1的。而且商场可能有多个收款台,他们分布在商场的不同位置,甚至可能在不同的楼层。因此如果没有一个自动产生流水号的机制,就需要人工来完成这项工作。很明显这显然是不可能的。虽然也可以通过前台应用程序来控制。但是这也会增加代码的复杂程度,而且如果要实现多个收款台同时创建销售订单进行统一编号,则基本上不怎么可能。为此通过数据库据的顺序编号生成器来实现这个需求,使最合理的一个方式。
通过Oracle的序列功能,可以让数据库来自动地生成流水号。而且这个流水号即使在并发行操作下也不会重复,生成的速度比较快、使用方便。
需求二:利用序列当作主键、外键。
在信息化管理系统中,主键外键的应用很普遍。如在一个ERP系统的销售订单中,其订单ID就是一个主键,它唯一的标识了一张销售订单。这个字段对于终端用户来说没有实际的参考价值。但是对于应用程序或者数据库来说,这个字段则是非常关键的,因为他们就是根据这个ID来唯一的标识销售订单。通常情况下,只需要保证这个字段唯一即可,随便什么整数都可以。唯一性的要求听起来简单,但是如果要实现手工控制的话,具有一定的难度。最好的情况下,就是让系统来进行控制。
为此在Oracle数据库中就提出了序列这个功能。数据库管理员如果在数据库设计中,利用序列当作主键。让各个表都使用这个序列产生的整数作为主键,那么对于数据库的设计、编程、各种主外键关系建立都能够起到意想不到的作用。简单的说,就是序列可以成为数据库中相互独立表之间的黏合剂,把他们组合成一个统一的表结构。
以上两个只是从用户的角度来考虑序列的作用。那么下面如果成程序员的角度来考虑,会对序列提出哪些具体的要求呢?笔者总结了日常数据库开发过程中大家对序列提出的具体要求以及具体的解决方案,希望能够对大家有所帮助。