2012-01-03 26 views
25

Tengo una tabla de workqueue que tiene una columna workid. La columna ID de trabajo tiene valores que se incrementan automáticamente. ¿Hay alguna manera de ejecutar una consulta en el back-end para insertar una nueva fila y hacer que el incremento de la columna workID sea automático?
Cuando intento insertar un nulo, arroja el error ORA01400 - No se puede insertar nulo en workid.Oracle - Insertar nueva fila con Auto Incremental ID

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. El guión tabla es como sigue

"WORKID" NUMBER NOT NULL ENABLE, 

Base de datos: Oracle 10g

Captura de pantalla de algunos datos existentes. enter image description here


RESPUESTA:

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. En pocas palabras, estaba tratando de insertar una fila en una tabla que ya tiene secuencias y activadores. 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 workid. Gracias a todos ustedes, me dio a todos un pulgar hacia arriba, estoy en condiciones de hacer frente a otro dragón hoy y ayudar a la atención al paciente dar un paso adelante!"

+0

posible duplicado de [Oracle - Modificar una tabla existente para autoincrementar una columna] (http://stackoverflow.com/questions/7681122/oracle-modify-an-existing-table-to-auto-increment-a -column) – Li0liQ

+0

@ Li0liQ - No, no estoy tratando de modificar la tabla en absoluto. Simplemente quiero insertar una nueva fila en la tabla existente tal como está. – Shaji

+0

Shaji: no olvides votar las respuestas útiles y seleccionar una de las más útiles y aceptarla. (Consulte [Preguntas frecuentes] (http://stackoverflow.com/faq).) –

Respuesta

12

para obtener un número de incremento automático que necesita para 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; 
/
+0

¿me pueden responder mi pregunta? No tengo la reputación suficiente para responder a mi pregunta y cerrarla. Copie y pegue esta gratitud a continuación: "Gracias a todos". Para mi solución, por favor mire bajo mi pregunta. " – Shaji

17

No hay una función de AUTO_INCREMENT en Oracle.

Usted necesita utilizar sequences y triggers.

Leer here cómo hacer las cosas bien. (paso a paso de cómo hacerlo para "Creación de columnas de incremento automático en Oracle")

+0

Consejos realmente buenos, exactamente lo que necesito. Muchas gracias +1 –

2

Puede utilizar cualquiera SEQUENCE o TRIGGER incrementar automáticamente el valor de una columna dada en la 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 las principales cláusulas utilizadas con activadores con ejemplos adecuados.

Utilice la sentencia CREATE TRIGGER para crear y activar un trigger, que es:

  • Un bloque PL/SQL almacenado asociado con una mesa, un esquema, o la base de datos o

  • un anónimo PL/SQL bloque o una llamada a un procedimiento implementado en PL/SQL o Java

Oracle Database ejecuta automáticamente un desencadenador cuando ocurren las condiciones especificadas.See.


siguiente es una sencilla TRIGGER sólo como un ejemplo para usted que inserta el valor de clave principal de una tabla especificada basándose en el valor máximo de esa columna. Puede modificar el nombre del esquema, el nombre de la tabla, etc. y usarlo. Solo inténtalo.

/*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; 

¿Sería genera automáticamente valores como CT0001, CT0002, CT0002 y así sucesivamente y se inserta en la columna dada de la tabla especificada.

3
 
[email protected]> create table cedvel(id integer,ad varchar2(15)); 

Table created. 

[email protected]> alter table cedvel add constraint pk_ad primary key(id); 

Table altered. 

[email protected]> create sequence test_seq start with 1 increment by 1; 

Sequence created. 

[email protected]> 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. 

[email protected]> insert into cedvel (ad) values ('nese'); 

1 row created. 
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; 

/

1

la completa saben, he incluido un ejemplo de los factores desencadenantes 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

+0

¿Debería" idtemasfor "ser" idtemasforo "en la segunda línea? – ragerdl

+0

¡Sí! ¡Gracias por la observación! –

1

Para completar, I' Menciono que Oracle 12c admite esta característica. También se supone que es más rápido que el enfoque de 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) ; 
1

Esta es una forma sencilla de hacerlo sin ningún activador o secuencias:

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

Se trabajó para mí, pero no funcionaría con una mesa vacía, supongo.

+0

Perfecto para una mesa no vacía, no necesita tratar con desencadenantes o secuencias con ese enfoque. – Siick

Cuestiones relacionadas