【问题标题】:Auto increment a field without sequence in ORACLE在 ORACLE 中自动增加一个没有序列的字段
【发布时间】:2013-12-12 20:50:00
【问题描述】:

我正在尝试增加一个没有序列的字段。有没有可能?? 我可以做这样的事情吗

INSERT INTO Test 
VALUES ((
         SELECT COUNT(ID) 
         FROM Test)+1)

请给我一个方法来做到这一点

【问题讨论】:

  • 我正在尝试增加一个没有序列的字段”。为什么你会想要那样做?在多用户环境中,使用 max()(或更糟糕的是:count())要么非常缓慢且不可扩展,要么完全错误。
  • 在多用户环境中,没有可扩展的可能性。原因是 ACID - 您的会话看不到来自其他会话的未提交数据。这也适用于最大值计算。顺便说一句:最新版本的 Oracle 12c 实现了自动增量。
  • 你能解释一下为什么你不想使用序列吗?

标签: sql oracle jdbc auto-increment


【解决方案1】:

例如,如果您的序列字段称为 seq_fld,您可以使用

insert into Test values ( (select max(seq_fld) from Test) + 1)

建议对 seq_fld 设置唯一性约束

【讨论】:

  • 但如果它是第一条记录,它将抛出 NULL 。所以我想最好使用 COUNT 而不是 MAX 。你怎么看?
  • 如果我们抛开这根本不是在多用户环境中实现列值递增的正确方法这一事实,如果我们用 @ 替换 insert into ... values(...) 语句,该查询仍然会产生不正确的结果987654323@
  • 为了覆盖第一个插入,您可以使用“select NVL(max(seq_fld), 0) from Test”
【解决方案2】:

您可以使用@var_name = SELECT MAX(column_name) FROM TABLE 获取变量中的当前最大值

那么你可以使用ROW_NUMBER() OVER (ORDER BY column_name)+@var_name

【讨论】:

    猜你喜欢
    • 2018-02-23
    • 2016-05-13
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多