Oracle SQL:如何生成按顺序序列号

时间:2014-12-20 01:15:19

标签: sql oracle

我想为输入的每个订单评论生成唯一的序列号。

例如,细分:

INSERT INTO order_comments(order_number,
                          seq_num,
                          comment_text,
                          remark_timestamp)
        VALUES (
                  'Smith',
                  (SELECT NVL (MAX (seq_num), 0) + 1
                     FROM order_comments
                    WHERE     order_number='141592'),
                  'Shipped updated version 1.1’,
                  current_timestamp);

可以多次运行,每次为该用户获取一个新的序列号。

坏消息是当它用Pro * C编写并且我们同时运行多个副本时,如果我们尝试同时为同一个用户插入两个注释,我们似乎会获得锁定。我们可以有一个order_comment_sequence,只需在插入中使用nextval,但这似乎不整洁,因为“141592”注释不会有序号。

为了当前的讨论,我们会说我们有几百万个订单,每个订单都有五个或十个评论。 order_number和seq_num是主键。

这样做有什么问题吗?有没有更简单的方法呢?

2 个答案:

答案 0 :(得分:3)

您可以使用Oracle序列。

首先创建序列,如下所示:

CREATE SEQUENCE order_comments_seq
  MINVALUE 1
  MAXVALUE 999999999999999999999999999
  START WITH 1
  INCREMENT BY 1
  CACHE 20;

了解更多信息:http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_6015.htm#SQLRF01314

然后您可以像这样使用sequence.NEXTVAL:

INSERT INTO order_comments(order_number,
                      seq_num,
                      comment_text,
                      remark_timestamp)
    VALUES ( 'Smith',
              order_comments_seq.NEXTVAL,
              'Shipped updated version 1.1’,
              current_timestamp);

答案 1 :(得分:1)

我不认为你可以避免"不整洁"如果你想避免锁定的方法。从数据库中检索数据时,您可以按ORDER_NUMBER生成序列号,如下所示:

SELECT order_number, ROW_NUMBER() OVER ( PARTITION BY order_number ORDER BY remark_timestamp ) AS seq_num
  FROM order_comments

"序列" @benji给出的方法是一种方法。另一种是使用SYS_GUID()生成随机数:

TO_NUMBER( SYS_GUID(), 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' )

您甚至可以在SEQ_NUM列上将其用作默认值:

ALTER TABLE order_comments MODIFY seq_num DEFAULT TO_NUMBER( SYS_GUID(), 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' );

希望这有帮助。