Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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
Sql Oracle-插入具有自动增量ID的新行_Sql_Oracle_Plsql_Oracle10g - Fatal编程技术网

Sql Oracle-插入具有自动增量ID的新行

Sql Oracle-插入具有自动增量ID的新行,sql,oracle,plsql,oracle10g,Sql,Oracle,Plsql,Oracle10g,我有一个workqueue表,它有一个workid列。workID列具有自动递增的值。是否有一种方法可以在后端运行查询以插入新行并自动增加workID列? 当我尝试插入null时,它抛出错误ORA01400-无法将null插入工作ID insert into WORKQUEUE (facilitycode,workaction,description) values ('J', 'II', 'TESTVALUES') 到目前为止,我一直在尝试查看表的详细信息,但没有看到任何自动增量。表

我有一个workqueue表,它有一个workid列。workID列具有自动递增的值。是否有一种方法可以在后端运行查询以插入新行并自动增加workID列?
当我尝试插入null时,它抛出错误ORA01400-无法将null插入工作ID

insert into WORKQUEUE  (facilitycode,workaction,description) values ('J', 'II',    'TESTVALUES')
到目前为止,我一直在尝试查看表的详细信息,但没有看到任何自动增量。表脚本如下所示

"WORKID" NUMBER NOT NULL ENABLE,
数据库:Oracle 10g

一些现有数据的屏幕截图。


回答:

我必须感谢每一个人的帮助。今天是一次很好的学习经历,没有你们的支持,我不可能做到。底线是,我试图在一个已经有序列和触发器的表中插入一行。我所要做的就是为我的问题找到正确的顺序,并将该顺序调用到我的查询中


你们提供给我的链接帮助我查找这些序列,并找到这个工作ID列的序列。多亏了你们,我向大家竖起了大拇指,今天我能够对付另一条龙,帮助患者护理向前迈进一步!“

Oracle中没有内置的自动增量

您需要使用
序列
触发器


阅读如何正确操作。(有关“在Oracle中创建自动增量列”的逐步操作步骤)

要获取自动增量编号,您需要在Oracle中使用序列。 (见和)


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

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

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

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

Oracle数据库在出现指定条件时自动执行触发器


下面是一个简单的
触发器
示例,用于根据列的最大值在指定表中插入主键值。您可以修改架构名称、表名称等并使用它。请尝试一下

/*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;
将自动生成诸如
CT0001
CT0002
CT0002
等值,并插入指定表的给定列中

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. ELXAN@DB1>创建表cedevel(id整数,ad varchar2(15)); 表已创建。 ELXAN@DB1>alter table cedvel add constraint pk_ad主键(id); 桌子改了。 ELXAN@DB1>创建序列测试_seqstart,增量为1乘以1; 序列已创建。 ELXAN@DB1>创建或替换触发器ad_插入 在cedvel上插入之前 引用新旧相同 每行 开始 选择test_seq.nextval to:new.id from dual; 结束; / 2 3 4 5 6 7 8 触发器已创建。 ELXAN@DB1>插入cedvel(ad)值(“nese”); 创建了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;
参考:

为了完整起见,我要提到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 ) ;

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

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

它对我来说很有效,但我想它对空表不起作用。

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

insert into WORKQUEUE (ID, facilitycode, workaction, description)
  values ((select max(ID)+1 from WORKQUEUE), 'J', 'II', 'TESTVALUES')
插入到工作队列(ID、设备代码、工作操作、说明) 值((从工作队列中选择计数(1)+1),'J','II','TESTVALUES')

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


它也适用于空表。

可能重复@Li0liQ-不,我根本不想修改表。我只是想按原样在现有表中插入一行。沙吉:别忘了对有用的答案进行投票,选择一个最有用的答案并接受它。(请参阅。)你能回答我的问题吗?我没有足够的声誉来回答我的问题并结束它。请将这份感激之情复制并粘贴到下面:“谢谢你们所有人”。对于我的解决方案,请看我的问题下面。“idtemasfor”应该是第二行的“idtemasforo”吗?非常适合非空表,不需要用这种方法处理触发器或序列。这对我来说很好,因为我没有创建序列的权限。我更改了我的第一个insert,将ID设置为1,效果非常好。对于空表,可以使用nvl(max(ID),0)+1,它将空值转换为作为参数传递的数字
insert into WORKQUEUE (ID, facilitycode, workaction, description)
  values ((select max(ID)+1 from WORKQUEUE), 'J', 'II', 'TESTVALUES')