我有一张样本表如下所示
PO_HEADER || ITEM || LINE_NUM
1 X
1 Y
1 Z
1 A
1 B 我想更新line_num列中的序列号,比如1.5。,当我输入另一行时,应该像line_number列中的6一样自动生成下一个序列号。
我想编写代码来更新line_num中的序列号&还想捕获下一个序列号。所以当我输入新行时,我应该得到下一个序列号。
发布于 2018-05-29 15:18:20
演示:http://sqlfiddle.com/#!4/4d6ff/1
CREATE TABLE Table1
("PO_HEADER" int, "ITEM" varchar2(1), "LINE_NUM" int)
;
INSERT ALL
INTO Table1 ("PO_HEADER", "ITEM", "LINE_NUM")
VALUES (1, 'X', NULL)
INTO Table1 ("PO_HEADER", "ITEM", "LINE_NUM")
VALUES (1, 'Y', NULL)
INTO Table1 ("PO_HEADER", "ITEM", "LINE_NUM")
VALUES (1, 'Z', NULL)
INTO Table1 ("PO_HEADER", "ITEM", "LINE_NUM")
VALUES (1, 'A', NULL)
INTO Table1 ("PO_HEADER", "ITEM", "LINE_NUM")
VALUES (1, 'B', NULL)
SELECT * FROM dual
;
create sequence alamakota;现在:
update table1 set LINE_NUM = alamakota.nextval;
select * from table1;
| PO_HEADER | ITEM | LINE_NUM |
|-----------|------|----------|
| 1 | X | 1 |
| 1 | Y | 2 |
| 1 | Z | 3 |
| 1 | A | 4 |
| 1 | B | 5 |发布于 2018-05-29 15:18:44
人们通常使用一个序列(Oracle对象),它提供了唯一性,但(通常来说)并不是无懈可击的。Sequence易于实现;您可以在insert期间调用它,或者创建一个数据库触发器,将列值设置为下一个序列号。
如果坚持使用"MAX + 1“选项,请注意,它在多用户环境中即将失败--两个或多个用户获取相同的最大值,这取决于COMMIT矩和列唯一性(主/唯一键、唯一索引),第一个选项将成功,其他每个用户的插入都将失败。
还有一个变通方法--附加的表,其序列号是通过一个自治事务函数来维护的。
如果您在12c,请使用identity列。否则,我会建议一个序列。
发布于 2018-05-29 15:44:16
我不会用序列来做这个。
如果有一个父表(其中PO_HEADER是外键),则获取父行上的锁。然后,将SELECT MAX(line_num)+1...用于该PO并使用它。在将插入提交到TABLE1之前,不要释放父表上的锁。
如果没有父表,则可以使用DBMS_LOCK完成相同的任务。(分配代表PO的用户锁并锁定它以代替父表)。
因为您的应用程序设计得很好,而且所有的TABLE1插入都是通过这段代码进行的,所以您知道它会工作的。父表上的锁确保两个会话不会获得相同的下一个行号,因为锁强制它们一个接一个地执行操作。
如果您的应用程序设计得不太好,这将无助于您。
https://stackoverflow.com/questions/50583318
复制相似问题