从Oracle 12c开始,我们可以使用IDENTITY字段。
有没有办法检索最后插入的身份(例如select @@identity
或select LAST_INSERTED_ID()
等等)?
答案 0 :(得分:10)
好。 Oracle在12c中使用IDENTITY功能的序列和默认值。因此,您需要了解问题的序列。
首先创建一个测试标识表。
CREATE TABLE IDENTITY_TEST_TABLE
(
ID NUMBER GENERATED ALWAYS AS IDENTITY
, NAME VARCHAR2(30 BYTE)
);
首先,让我们找到使用此标识列创建的序列名称。此序列名称是表格中的默认值。
Select TABLE_NAME, COLUMN_NAME, DATA_DEFAULT from USER_TAB_COLUMNS
where TABLE_NAME = 'IDENTITY_TEST_TABLE';
对我而言,这个值是" ISEQ $$ _ 193606"
插入一些值。
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla');
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('aydın');
然后插入值并找到身份。
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla');
SELECT "ISEQ$$_193606".currval from dual;
你应该看到你的身份价值。如果你想在一个区块中使用
declare
s2 number;
begin
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla') returning ID into s2;
dbms_output.put_line(s2);
end;
上次ID是我的标识列名称。
答案 1 :(得分:1)
IDENTITY
列使用了SEQUENCE
“引擎盖” - 使用它所使用的表自动创建和删除序列。
此外,您可以使用指定start with和increment参数
从1000开始并以2递增。当您不想直接操作它时,使用IDENTITY
非常方便。
但如果你需要以某种方式直接操作序列,你应该使用
Oracle 12c中提供的另一个选项 - 列默认值。 Sutch默认
值可以从序列nextval
或currval
生成。允许您拥有一个易于理解的序列名称,并将其用作" identity"没有触发器。
create table my_new_table
(id number default my_new_table_seq.nextval not null)
您将始终可以致电:my_new_table_seq.currval
。
可以使用SEQUENCE
子句从插入语句中获取RETURNING
生成的ID。
例如,创建一个临时表:
create global temporary table local_identity_storage ("id" number) on commit delete rows
在临时表中保存此值:
CREATE TABLE identity_test_table (
id_ident NUMBER GENERATED BY DEFAULT AS IDENTITY,
same_value VARCHAR2(100)
);
declare
v_id number(10, 0);
begin
INSERT INTO identity_test_table
(same_value)
VALUES
('Test value')
RETURNING id_ident INTO v_id;
insert into local_identity_storage ("id") values (v_id);
commit;
end;
现在你有了#34;本地"插入ID。
select "id" from local_identity_storage
答案 2 :(得分:1)
似乎Oracle实施IDENTITY
只是为了说它们支持身份。所有内容仍然使用SEQUENCES
实现,有时您需要访问SEQUENCE
才能完成部分工作(即检索最新插入的IDENTITY
)。
无法检索类似于MySQL,SQL Server,DB2等的IDENTITY
,您必须使用SEQUENCE
检索它。
答案 3 :(得分:1)
请检查
INSERT INTO yourtable (....)
VALUES (...)
RETURNING pk_id INTO yourtable;
它可以帮助您检索最后插入的行
答案 4 :(得分:0)
您的范围,全局或上次用户是什么? 如果全球只使用
SELECT mytable_seq.nextval MyTableID FROM DUAL
https://www.sitepoint.com/community/t/oracle-last-insert-id-question/1402
如果具体封装您的插页&在交易中查询。
答案 5 :(得分:0)
正如我在this blog post中所写的那样,您可以通过一个查询来获取模式的所有当前标识值:
with
function current_value(p_table_name varchar2) return number is
v_current number;
begin
for rec in (
select sequence_name
from user_tab_identity_cols
where table_name = p_table_name
)
loop
execute immediate 'select ' || rec.sequence_name || '.currval from dual'
into v_current;
return v_current;
end loop;
return null;
end;
select *
from (
select table_name, current_value(table_name) current_value
from user_tables
)
where current_value is not null
order by table_name;
/
答案 6 :(得分:-1)
最后一次插入将是该列的最高值。 所以我认为最简单的方法是使用 max() 方法。 像这样
select max(id) from table_name