Oracle 生成自动Id
我正在制作一个web应用程序,它使用一个数据库,其中我有一个字段I_ID,我想随着数据库中的每个记录插入自动递增,如I0、I1、I2等等 为了实现这一点,我为这张桌子做了一个触发器。但它不能正常工作。原因是什么。请帮忙 我的触发器T1:Oracle 生成自动Id,oracle,oracle10g,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 varchar
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;
/
但它给出了两个错误
应为下列情况之一时遇到符号“=”:=。(@%)指标
遇到符号“结束”
请帮助这样Oracle就不是SQL Server了。。。 如果您想获得唯一的ID,则需要从序列中填充它们 要创建序列,请使用:
create sequence myseq;
在代码使用中(取决于版本):
或
您的代码不起作用的问题是:new和:old意味着什么。。。
我建议你阅读他们的意思
希望我能帮上忙
由于评论中的讨论,以下是一个完整的示例: 对于此表:
CREATE TABLE test (A number);
要添加唯一的顺序ID,您需要首先创建一个顺序:
CREATE SEQUENCE myseq;
和一个触发器:
创建或替换触发器“T1”
之前
在“测试”中插入
每行
开始
:new.I_ID:=myseq.nextval;
t1末端;
/
顺便说一句-我建议在替换之前检查:new.I_ID,如果它为空或不为空,因为有时在升级过程中,人们会从外部资源添加一个唯一的ID…(例如,他们从序列本身获得一个唯一的编号…)
您可以在此处阅读有关序列的更多信息:
很抱歉代码的显示方式…需要学习如何在此处编写代码
还有一件事——在Oracle中——您不能创建这样一个PL/SQL来增加没有锁的现有计数器。
并发查询可能同时运行PL/SQL中的第一个查询,这意味着多个会话将获得相同的I\U ID
还要注意,在代码中,您查询了varchar上的max,这与number上的max不同
添加连接文本与唯一ID无关。在您的情况下,它将如下所示:
:new.I_ID=substr(:new.I_ID,1,1)| to_char(myseq.nextval);
假设x输入的是您想要的字符..很抱歉,我没有得到您Oracle有一个名为“sequence”的唯一标识符机制。它是和对象,创建唯一id。因此您需要在DB中创建此对象-它就像一个表,与触发器中的PL/SQL无关。您可以在任何地方使用它。在PL/SQL中,您可以在版本11中使用它(可能也是10g2)请你写修改过的触发器好吗?我正在处理oracle 10g。因此,后面的一个将对我有所帮助。我将尝试提前用完整的example.ohk.thanx创建一个更有用的答案。
CREATE TABLE test (A number);
CREATE SEQUENCE myseq;