Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 生成自动Id_Oracle_Oracle10g - Fatal编程技术网

Oracle 生成自动Id

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

我正在制作一个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;
/
但它给出了两个错误

应为下列情况之一时遇到符号“=”:=。(@%)指标

遇到符号“结束”


请帮助

这样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;