【问题标题】:Auto increment without sequence无顺序自动递增
【发布时间】:2015-11-18 18:48:37
【问题描述】:

我有一个 select 语句,此后生成设置值我想将该组值插入到另一个表中,我担心我在 select 中使用 select 语句我正在使用另一个 select 子句((select max(org_id )+1 from org)) 我试图获得最大值并增加一,但我无法获得增加的值,而是获得相同的值,你可以看到列名 id_limit

select abc,abc1,abc3,abc4,(select max(org_id)+1 from org) as id_limit from xyz

current output    
    -----------------------------------------------------------------
     | abc           |  abc1       |   abc3 | abc4   | id_limit     |
     ----------------------------------------------------------------|
     | BUSINESS_UNIT |    0        |   100  | London | 6            |
     | BUSINESS_UNIT |    0        |   200  | Sydney | 6            |
     | BUSINESS_UNIT |    0        |   300  | Kiev   | 6            |
     -----------------------------------------------------------------

我正在尝试获得预期的输出

     -----------------------------------------------------------------
     | abc           |  abc1       |   abc3 | abc4   | id_limit     |
     ----------------------------------------------------------------|
     | BUSINESS_UNIT |    0        |   100  | London | 6            |
     | BUSINESS_UNIT |    0        |   200  | Sydney | 7            |
     | BUSINESS_UNIT |    0        |   300  | Kiev   | 8            |
     -----------------------------------------------------------------

【问题讨论】:

  • 使用序列。 orgxyz 应该是同一张桌子吗?你怎么知道哪一行得到哪个值?您打算对abc3 进行排序吗?
  • 这正是序列被发明的原因。他们是这个问题的解决方案。为什么不想使用序列?
  • 不管你怎么称呼它,你的任务是生成一个全局唯一标识符。此操作要求互斥,否则竞争计算最终得到相同结果的机会总是有(可能很小但总是非零)。有很多方法可以确定哪些序列可能是最简单的互斥。
  • 使用max() 方法实现唯一编号生成有两种可能的方法:一种是缓慢的,在给定时间只有一个事务可以插入或访问表,或者错误的一种是允许多个事务,但唯一性是不可能的(这就是您已经实现的)。 唯一可扩展且稳健的方法是使用序列。为什么不想使用序列?

标签: oracle


【解决方案1】:

是的,在 Oracle 12 中。

create table foo (
  id number generated by default on null as identity
);

https://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1

在以前的版本中,您使用序列/触发器,如下所述:

How to create id with AUTO_INCREMENT on Oracle?

【讨论】:

    猜你喜欢
    • 2011-01-25
    • 2018-09-06
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2016-03-07
    • 2012-12-08
    相关资源
    最近更新 更多