我正在创建一个使用数据库的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”
请帮忙
答案 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正在输入您想要的字符..