获取记录在插入数据库表时获得的唯一ID

时间:2015-05-14 12:24:01

标签: sql oracle

我有一个带有唯一id列的oracle表。当我将数据插入表格时,我会增加最后一个id

insert into my_table vlaues((select max(id) from my_table), 'etc', 'etc');

可以有多个进程同时写入此表。

自动提交是on

除了id之外,此表没有任何其他唯一列。

当我向表中插入记录时,在插入记录后,是否有办法获取记录获得的id值?

正如我所看到的,如果我在插入后使用select max(id) from my_table,我可能无法获得insert语句中使用的id,因为在我发出select之前,其他人可能已经插入了另一条记录。

4 个答案:

答案 0 :(得分:4)

Oracle 12终于拥有了内置的标识列。因此,如果您使用的是最新版本的Oracle,则可以使用它。阅读它here

在早期版本中,最好使用序列。这保证了独特性,即使在多线程环境中也是如此。我总是实现触发器来更新id列。 Here是对类似问题的回答,解释了如何执行此操作。

答案 1 :(得分:2)

你可以试试这个:

CREATE TABLE myTable( ID RAW(16) DEFAULT SYS_GUID())

此外,最好使用Sequence来获取自动增加的ID。

如果您想在插入后获取序列ID,可以尝试这样:

declare
x  number;
id number;
begin
x := your_sequence.nextval;
insert into mytable (column1, column2, column3) 
values (x, value2, value3) returning x into id;

dbms_output.put_line(to_char(id));
end;

答案 2 :(得分:0)

最好在这种情况下使用序列(尽管最终可能会出现数字上的差距)。您可以使用seq_abc1.currval/nextval获取当前/下一个值。

答案 3 :(得分:0)

  

当我向表中插入记录时,在插入记录后,有没有办法获取记录得到的id值?

只需使用 RETURNING 子句。

例如 -

RETURNING identity_id INTO variable_id;

测试用例 -

SQL> set serveroutput on
SQL> CREATE TABLE t
  2    (ID NUMBER GENERATED ALWAYS AS IDENTITY, text VARCHAR2(50)
  3    );

Table created.

SQL>
SQL> DECLARE
  2    var_id NUMBER;
  3  BEGIN
  4    INSERT INTO t
  5      (text
  6      ) VALUES
  7      ('test'
  8      ) RETURNING ID INTO var_id;
  9    DBMS_OUTPUT.PUT_LINE('ID returned is = '||var_id);
 10  END;
 11  /
ID returned is = 1

PL/SQL procedure successfully completed.

SQL>

SQL> select * from t;

        ID TEXT
---------- --------------------------------------------
         1 test

SQL>

您也可以使用与返回相同的 12c之前版本的技术,其中您没有 IDENTITY 列。 returns子句将返回您插入表中的值。