Diferencia entre Unique y Primary Key Oracle ORA-00001: unique constraint violated

Diferencia entre Unique y Primary Key en Oracle
ORA-00001: unique constraint violated

Cuando escribía este post, me causó curiosidad de porque este es el error número de 1 de Oracle.
Si bien parece algo bastante fácil de explicar, que es lo que está pasando, les cuento que hace unos días me enfrenté con uno de estos, que me quitó bastante tiempo y creo que es bueno compartirlo.

Resulta que un amigo me pidió ayuda con un problema de unique constraint violated y ahi fui a intentar ayudarlo, con grandes posibilidades de resolverlo inmediatamente, pero… la cosa duró un poco más de lo esperado.

Antes de comenzar quiero explicar un poco la diferencia entre una clave de tipo primary key y una de unique.

La diferencia esta en que una clave unique permite nulos, en cuanto una primary key no permite nulos es decir ya incluye la constraint de not null para cada atributo.

Un ejemplo:

Con Primary key

create table fdls01
(col_a number primary key,
col_b number);

insert into fdls01 values(1,1);
1 linha criada.

insert into fdls01 values(null,2);
ORA-01400: cannot insert NULL into (“esquema1″.”FDLS01″.”COL_A”)

Con Unique

create table fdls02
(col_a number unique,
col_b number);

insert into fdls02 values(1,1);
1 linha criada.

insert into fdls02 values(null,2);
1 linha criada.

Como se puede apreciar, en esta segunda ocasión nos dejó hacer el insert sin problema.

Ahora quiero saber que mensaje me da para las 2 tablas, inentando insertar registros ya existentes:

luego probamos las constraints
insert into fdls01 values(1,1);
ORA-00001: unique constraint (esquema1.SYS_C0032094) violated

insert into fdls02 values(1,1);
ORA-00001: unique constraint (esquema1.SYS_C0032095) violated

Las 2 dan el mismo error

Ahora tomando el nombre de la constraint violada, buscaremos en la vista de constraints, cual es la diferencia entre ellas:

si buscamos la constraint en la vista de constraints

select owner,constraint_name,constraint_type from user_constraints
where constraint_name like ‘%SYS_C0032094%’;

OWNER CONSTRAINT_NAME C
—————————— —————————— –
esquema1 SYS_C0032094 P

select owner,constraint_name,constraint_type from user_constraints
where constraint_name like ‘%SYS_C0032095%’;

OWNER CONSTRAINT_NAME C
—————————— —————————— –
esquema1 SYS_C0032095 U

la diferencia esta en el type

Bien ahora yendo al problema presentado por mi amigo

El problema radicaba en que alguien habia creado una tabla sin usar unique como constraint pero usando indices unique para reflejar lo mismo. Algo que no aconsejo, pero paso a explicar en detalle:

create table fdls03
(col_a number,
col_b number);

notar que no esta la cláusula unique como lo había hecho en los ejemplos anteriores.

y luego creo el indice

create unique index fdls03_pk on fdls03(col_a);

e intento hacer los 2 inserts como lo hice en el ejemplo anterior

insert into fdls03 values(1,1);
1 linha criada.

insert into fdls03 values(null,2);
1 linha criada.

permite hacer el insert porque el nulo vale, y al tratar de insertar otro registro repetido

insert into fdls03 values(1,1);
ORA-00001: unique constraint (esquema1.FDLS03_PK) violated

entonces en mi caso particular me encuentro con un nombre FDLS03_PK
que me confundio totalmente con una pk y entonces fui a buscar a la vista de constraints a ver cual era esa constraint

select owner,constraint_name,constraint_type from user_constraints
where constraint_name like ‘%FDLS03_PK%’;

y opa

não há linhas selecionadas

no existe esa constraint! porque alguien en vez de definirla como constraint
simplemente definio la tabla simple sin constraints y uso un indice unique para controlar esto.

El resultado final se podria decir que es el mismo pero… como complicó la vida.
Ademas tenemos que tener en cuenta que en los casos anteriores un indice puede ser dropeado y la tabla sigue funcionando integramente, si dropeamos este ultimo indice la integridad no sera la misma.

Fabricio De los Santos
Gerencia de Proyectos – Consultoría GeneXus –
ERP – Sistemas de Misión Crítica – Bases de Datos.

Vea mis blogs en:
www.fabriciodelossantos.com

Deja un comentario