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”:
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”:
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:
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:
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”:
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:
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