我有一个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
一些现有数据的屏幕截图。
解答:
我要感谢每个人和每个人的帮助。今天是一次很棒的学习经历,没有你的支持,我无法做到。最重要的是,我试图在已经有序列和触发器的表中插入一行。我所要做的就是为我的问题找到正确的序列,并将该序列调用到我的查询中。
您提供给我的链接帮助我查看了这些序列,并找到了适用于此workid列的序列。谢谢大家,我给大家竖起了大拇指,今天我能够解决另一条龙,帮助病人护理向前迈出一步!“
答案 0 :(得分:18)
答案 1 :(得分:17)
要获取自动增量编号,您需要在Oracle中使用序列。 (请参阅here和here)。
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)
您可以使用SEQUENCE
或TRIGGER
自动增加数据库表中给定列的值,但使用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;
会自动生成CT0001
,CT0002
,CT0002
等值,并插入到指定表的给定列中。
答案 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)列
它同样适用于空表。