我想为输入的每个订单评论生成唯一的序列号。
例如,细分:
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是主键。
这样做有什么问题吗?有没有更简单的方法呢?
答案 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' );
希望这有帮助。