Oracle - 使用自动增量ID插入新行

时间:2012-01-03 19:38:30

标签: sql oracle plsql oracle10g

我有一个workqueue表,它有一个workid列。 workID列具有自动递增的值。有没有办法在后端运行查询以插入新行并自动增加workID列? 当我尝试插入null时,它会抛出错误ORA01400 - 无法将null插入到workid中。

insert into WORKQUEUE  (facilitycode,workaction,description) values ('J', 'II',    'TESTVALUES')

到目前为止我尝试了什么 - 我试着查看表格详细信息,但没有看到任何自动增量。表脚本如下

"WORKID" NUMBER NOT NULL ENABLE,

数据库:Oracle 10g

一些现有数据的屏幕截图。 enter image description here


解答:

我要感谢每个人和每个人的帮助。今天是一次很棒的学习经历,没有你的支持,我无法做到。最重要的是,我试图在已经有序列和触发器的表中插入一行。我所要做的就是为我的问题找到正确的序列,并将该序列调用到我的查询中。

您提供给我的链接帮助我查看了这些序列,并找到了适用于此workid列的序列。谢谢大家,我给大家竖起了大拇指,今天我能够解决另一条龙,帮助病人护理向前迈出一步!“

9 个答案:

答案 0 :(得分:18)

Oracle中没有内置的auto_increment。

您需要使用sequencestriggers

阅读here如何正确行事。 (“在Oracle中创建自动增量列”的逐步操作方法)

答案 1 :(得分:17)

要获取自动增量编号,您需要在Oracle中使用序列。 (请参阅herehere)。

CREATE SEQUENCE my_seq;

SELECT my_seq.NEXTVAL FROM DUAL; -- to get the next value

-- use in a trigger for your table demo
CREATE OR REPLACE TRIGGER demo_increment 
BEFORE INSERT ON demo
FOR EACH ROW

BEGIN
  SELECT my_seq.NEXTVAL
  INTO   :new.id
  FROM   dual;
END;
/

答案 2 :(得分:8)

这是一种没有任何触发器或序列的简单方法:

insert into WORKQUEUE (ID, facilitycode, workaction, description)
  values ((select max(ID)+1 from WORKQUEUE), 'J', 'II', 'TESTVALUES')

我认为这对我有用,但不适用于空桌。

答案 3 :(得分:3)

ELXAN@DB1> create table cedvel(id integer,ad varchar2(15));

Table created.

ELXAN@DB1> alter table cedvel add constraint pk_ad primary key(id);

Table altered.

ELXAN@DB1> create sequence test_seq start with 1 increment by 1;

Sequence created.

ELXAN@DB1> create or replace trigger ad_insert
before insert on cedvel
REFERENCING NEW AS NEW OLD AS OLD
for each row
begin
    select test_seq.nextval into :new.id from dual;
end;
/  2    3    4    5    6    7    8 

Trigger created.

ELXAN@DB1> insert into cedvel (ad) values ('nese');

1 row created.

答案 4 :(得分:2)

您可以使用SEQUENCETRIGGER自动增加数据库表中给定列的值,但使用TRIGGERS会更合适。请参阅以下Oracle文档,其中包含与具有合适示例的触发器一起使用的主要子句。

  

使用CREATE TRIGGER语句创建和启用数据库触发器,即:

     
      
  • 与表,模式或模式关联的存储PL / SQL块   数据库或

  •   
  • 匿名PL / SQL块或对实现的过程的调用   PL / SQL或Java

  •   
     

Oracle Database会在指定的条件发生时自动执行触发器。 See


以下是一个简单的TRIGGER,仅作为示例,根据该列的最大值将主键值插入指定的表中。您可以修改架构名称,表名称等并使用它。试试吧。

/*Create a database trigger that generates automatically primary key values on the CITY table using the max function.*/

CREATE OR REPLACE TRIGGER PROJECT.PK_MAX_TRIGGER_CITY
BEFORE INSERT ON PROJECT.CITY
FOR EACH ROW
DECLARE 
    CNT NUMBER;
    PKV CITY.CITY_ID%TYPE;
    NO NUMBER;
BEGIN
    SELECT COUNT(*)INTO CNT FROM CITY;

    IF CNT=0 THEN
        PKV:='CT0001';
    ELSE
        SELECT 'CT'||LPAD(MAX(TO_NUMBER(SUBSTR(CITY_ID,3,LENGTH(CITY_ID)))+1),4,'0') INTO PKV
        FROM CITY;
    END IF; 
    :NEW.CITY_ID:=PKV;
END;

会自动生成CT0001CT0002CT0002等值,并插入到指定表的给定列中。

答案 5 :(得分:1)

SQL trigger for automatic date generation in oracle table:

CREATE OR REPLACE TRIGGER name_of_trigger

BEFORE INSERT

ON table_name

REFERENCING NEW AS NEW

FOR EACH ROW

BEGIN

SELECT sysdate INTO :NEW.column_name FROM dual;

END;

/

答案 6 :(得分:1)

完整的诀窍,我已经包含了一个触发器和序列的例子

create table temasforo(
idtemasforo NUMBER(5) PRIMARY KEY,
autor       VARCHAR2(50) NOT NULL,
fecha       DATE DEFAULT (sysdate),
asunto      LONG  );

create sequence temasforo_seq
  start with 1
  increment by 1
  nomaxvalue;

create or replace
trigger temasforo_trigger
  before insert on temasforo
  referencing OLD as old NEW as new
  for each row
  begin
      :new.idtemasforo:=temasforo_seq.nextval;
    end;

参考: http://thenullpointerexceptionx.blogspot.mx/2013/06/llaves-primarias-auto-incrementales-en.html

答案 7 :(得分:1)

为了完整起见,我提到Oracle 12c确实支持此功能。而且它应该比触发器方法更快。例如:

CREATE TABLE foo
  (
    id NUMBER GENERATED BY DEFAULT AS IDENTITY (
    START WITH 1 NOCACHE ORDER ) NOT NULL ,
    name       VARCHAR2 (50)
  )
  LOGGING ;
ALTER TABLE foo ADD CONSTRAINT foo_PK PRIMARY KEY ( id ) ;

答案 8 :(得分:0)

这是一种简单的方法,无需任何触发器或序列:

插入WORKQUEUE(ID,设施代码,工作操作,描述) 值((从WORKQUEUE中选择count(1)+1),“ J”,“ II”,“ TESTVALUES”);

注意:这里需要使用count(1)代替max(id)列

它同样适用于空表。