生成自动Id

时间:2014-03-22 14:18:30

标签: oracle oracle10g

我正在创建一个使用数据库的Web应用程序,其中我有一个字段I_ID,我希望自动增加,如I0然后I1然后是I2,依此类推,每次记录插入数据库。

为了达到这个目的,我为这张桌子做了一个触发器。但它没有正常工作。可能是什么原因。请帮忙

我的触发器T1:

CREATE OR REPLACE TRIGGER  "T1" 
before
insert on "TBINDIVIDUAL"
for each row
declare 
x varchar2(10);
mx varchar2(13);
mx2 varchar2(13);
y number(3);
begin
x:=:new.I_ID;
mx:=substr(x,1,1);
select max(I_ID) into mx2 from tbindividual where I_ID like mx||'%';
y:=to_number(substr(mx2,2));
:new.I_ID:=mx||to_char(y+1);
end t1;
/

已编辑: 正如我所做的那样回答

CREATE OR REPLACE TRIGGER  "TBINDIVIDUAL_T1" 
BEFORE
insert on "TBINDIVIDUAL"
for each row
begin
:new.I_ID = SEQ1.nextval;
end;
/

但它有两个错误

在期待以下之一时遇到符号“=”:: =。 (@%;指标

遇到符号“END”

请帮忙

1 个答案:

答案 0 :(得分:1)

所以Oracle不是SQL Server ...... 如果你想获得唯一的ID,你需要从序列中填充它们。

用于创建序列使用:

create sequence myseq;

并在您的代码中使用(取决于版本):

:new.I_ID := myseq.nextval;

select myseq.nextval into :new.I_ID from dual;

你的代码不起作用的问题是:新的和:旧的意思是...... 我建议你阅读他们的意思...

希望我一直很有帮助......


由于评论中的讨论 - 这是一个完整的例子: 对于这个表:

CREATE TABLE test (A number);

添加首先创建序列所需的唯一顺序ID:

CREATE SEQUENCE myseq;

和触发器:

CREATE OR REPLACE TRIGGER "T1" before insert on "test" for each row begin :new.I_ID := myseq.nextval; end t1; /

顺便说一下 - 我建议在替换之前检查:new.I_ID,如果它是否为null,有时在升级时人们从外部资源添加一个唯一的ID ..(例如他们从中获取一个唯一的ID序列本身......)

您可以在此处阅读有关序列的更多信息: http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_6015.htm#SQLRF01314

对不起代码的显示方式..需要学习如何在此处编写代码...

还有一件事 - 在Oracle中 - 您不能创建这样的PL / SQL来增加现有的计数器而不使用锁。 并发查询可能同时运行PL / SQL中的第一个查询,这意味着多个会话将获得相同的I_ID。

另请注意,在您的代码中,您查询了varchar上的最大值,这与数字上的最大值不同...


添加连锁文本与唯一ID无关。在你的情况下,它看起来像:

:new.I_ID = substr(:new.I_ID,1,1)||to_char(myseq.nextval);

假设x正在输入您想要的字符..