sql - new - Oracle-Insertar nueva fila con ID incremental automática
oracle database id auto increment (8)
Tengo una tabla de colas de trabajo que tiene una columna workid. La columna workID tiene valores que se incrementan automáticamente. ¿Hay alguna manera de que pueda ejecutar una consulta en el backend para insertar una nueva fila y tener el incremento de columna workID automáticamente?
Cuando intento insertar un nulo, arroja el error ORA01400 - No se puede insertar un nulo en Workid.
insert into WORKQUEUE (facilitycode,workaction,description) values (''J'', ''II'', ''TESTVALUES'')
Lo que he intentado hasta ahora, traté de mirar los detalles de la tabla y no vi ningún incremento automático. La tabla de comandos es la siguiente
"WORKID" NUMBER NOT NULL ENABLE,
Base de datos: Oracle 10g
Captura de pantalla de algunos datos existentes.
RESPONDER:
Tengo que agradecer a todos y cada uno por la ayuda. Hoy fue una gran experiencia de aprendizaje y sin su apoyo, no podría haberlo hecho. La conclusión es que intentaba insertar una fila en una tabla que ya tiene secuencias y desencadenadores. Todo lo que tenía que hacer era encontrar la secuencia correcta para mi pregunta y llamar esa secuencia a mi consulta.
Los enlaces que me proporcionaron me ayudaron a buscar estas secuencias y encontrar la que es para esta columna de trabajo. ¡Gracias a todos, les di a todos un pulgar hacia arriba, hoy puedo atacar a otro dragón y ayudar a la atención al paciente a dar un paso adelante! "
El know how completo, he incluido un ejemplo de los disparadores y la secuencia.
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;
referencia: http://thenullpointerexceptionx.blogspot.mx/2013/06/llaves-primarias-auto-incrementales-en.html
Esta es una forma sencilla de hacerlo sin ningún desencadenante o secuencia:
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.
Funcionó para mí, pero no funcionaría con una mesa vacía, supongo.
No hay un auto_increment incorporado en Oracle.
Necesitas usar sequences
y triggers
.
Lee here cómo hacerlo bien. (Instrucciones paso a paso para "Crear columnas de incremento automático en Oracle")
Para completar, mencionaré que Oracle 12c soporta esta función. También es supuestamente más rápido que el enfoque de los disparadores. Por ejemplo:
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 ) ;
Para obtener un número de incremento automático debe usar una secuencia en Oracle. (Ver here y 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;
/
Puede usar SEQUENCE
o TRIGGER
para incrementar automáticamente el valor de una columna dada en su tabla de base de datos, sin embargo, el uso de TRIGGERS
sería más apropiado. Consulte la siguiente documentación de Oracle que contiene cláusulas principales utilizadas con desencadenantes con ejemplos adecuados.
Use la sentencia CREATE TRIGGER para crear y habilitar un desencadenante de base de datos, que es:
Un bloque de PL / SQL almacenado asociado con una tabla, un esquema o la base de datos o
Un bloque PL / SQL anónimo o una llamada a un procedimiento implementado en PL / SQL o Java
La base de datos Oracle ejecuta automáticamente un disparador cuando ocurren condiciones específicas. See
A continuación se muestra un TRIGGER
simple como ejemplo para usted que inserta el valor de la clave primaria en una tabla específica basada en el valor máximo de esa columna. Puede modificar el nombre del esquema, el nombre de la tabla, etc. y usarlo. Sólo dale una oportunidad.
/*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
automáticamente valores tales como CT0001
, CT0002
, CT0002
y así sucesivamente e inserta en la columna dada de la tabla especificada.
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;
/
insert into WORKQUEUE (ID, facilitycode, workaction, description)
values ((select max(ID)+1 from WORKQUEUE), ''J'', ''II'', ''TESTVALUES'')