Sql Oracle-插入具有自动增量ID的新行
我有一个workqueue表,它有一个workid列。workID列具有自动递增的值。是否有一种方法可以在后端运行查询以插入新行并自动增加workID列?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') 到目前为止,我一直在尝试查看表的详细信息,但没有看到任何自动增量。表
当我尝试插入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
下面是一个简单的
触发器
示例,用于根据列的最大值在指定表中插入主键值。您可以修改架构名称、表名称等并使用它。请尝试一下
/*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')