Hace algún tiempo me preguntaban que como se realizaba un autoincremental en Oracle, para lo que saben poco, no es más que un atributo que se utiliza para generar un identificador único para cada nueva fila de una tabla, yo se que existe en Mysql simplemente especificando “AUTO_INCREMENT” en el campo al crear la tabla, generalmente en su llave primaria.
Mi respuesta fue, que hasta donde yo se, no existe este atributo en Oracle, aunque con un pequeño trigger se puede “emular” fácilmente la lógica de este atributo en oracle, pero veamos como, claro con un ejemplo sencillo para los menos versados en el tema.
Primero creamos la clásica tabla de pruebas llamada “employees”:
1 2 3 4 5 | CREATE TABLE employees ( employee_id NUMBER NOT NULL, firts_name VARCHAR2(20), last_name VARCHAR2(20), salary NUMBER); |
Le creamos su llave primaria en el campo “employee_id”:
1 | ALTER TABLE employees add constraint "PKemployees" primary key (employee_id); |
Creamos el susodicho trigger que generara automáticamente el identificador para cada nueva fila, por supuesto, también lo pudimos haber realizado en base a una secuencia pero este caso, por facilidad, lo crearemos con un simple max + 1:
1 2 3 4 5 6 7 8 9 10 11 12 | CREATE OR REPLACE TRIGGER tr_pk_employees before INSERT ON employees FOR each ROW DECLARE BEGIN SELECT NVL(MAX(employee_id),0) + 1 INTO :NEW.employee_id FROM employees; END; |
Es todo, ahora al realizar un insert a la tabla solo necesitamos los valores para los demás campos, si lo queremos hacer sin especificar campos tendremos que ponerle “null” o en su defecto doble comilla simple:
1 2 3 | INSERT INTO employees VALUES (NULL, 'pancho', 'lopez',1000); INSERT INTO employees VALUES (NULL, 'juan', 'penas',2000); INSERT INTO employees VALUES (NULL, 'nacho','vazquez',3000); |
O especificando los campos sin necesidad del campo “employee_id”:
1 2 3 | INSERT INTO employees (firts_name, last_name, salary) VALUES ('guicho','sanchez',4000); INSERT INTO employees (firts_name, last_name, salary) VALUES ('rolando', 'calles',5000); INSERT INTO employees (firts_name, last_name, salary) VALUES ('juan','gabriel',6000); |
Y para corroborar que todo funcionó correctamente, revisamos los datos:
1 2 3 4 5 6 7 8 9 10 | SQL> SELECT * FROM employees; EMPLOYEE_ID FIRTS_NAME LAST_NAME SALARY ----------- -------------------- -------------------- ---------- 1 pancho lopez 1000 2 juan penas 2000 3 nacho vazquez 3000 4 guicho sanchez 4000 5 rolando calles 5000 6 juan gabriel 6000 |
Gracias! muy bien explicado me fue muy util…!!!
Gracias chibolo!
Muchas gracias por la explicación, funciono el ejemplo perfectamente para el proceso en que lo necesitaba
Hola! muchas gracias por el ejemplo, esta genial!! y super bien explicado. Solo me queda una duda, como se comporta en un sistema concurrente? puede darse el caso de que dos inserciones obtengan el mismo codigo?
justo lo que estaba buscando