Porque me aparece este error

publicado por: Anonymous

ERROR: llave duplicada viola restricción de unicidad «matricula_pkey»
DETAIL: Ya existe la llave (cod_est, cod_asig)=(1085, 1080). SQL
state: 23505

A la hora de ingresar los datos de una tabla me aparece este error, y mi base de datos esta conformada de la siguiente manera:

create table Estudiante(
cod_est varchar (11) primary key,
nom_est varchar(35),
apell_est varchar(35),
edad smallint,
estrato smallint,
genero char(1),
fecha_nac date
);

create table matricula(
cod_est varchar(11),
cod_asig varchar(4),
fechainc date default '1-08-2018', 
fechafin date default '30-11-2018',
nota real check(nota>=10 and nota<=50),
primary key (cod_est, cod_asig),
Foreign key (cod_est) REFERENCES Estudiante(cod_est)on delete no action,
foreign key (cod_asig)REFERENCES asignatura(cod_asig)on delete no action
);

create table asignatura(
cod_asig varchar(4) primary key not null,
nom_asig varchar(35),   
nrocred smallint
);

Lo que intento hacer es:

insert into matricula (cod_est,cod_asig,fechainc,fechafin,nota)
values 
           ('1085','2030',default,default,10),
           ('1453','1011',default,default,18);

solución

El error que estás teniendo es bastante claro:

ERROR: llave duplicada viola restricción de unicidad «matricula_pkey»
DETAIL: Ya existe la llave (cod_est, cod_asig)=(1085, 1080). SQL
state: 23505

En el CREATE TABLE de la tabla matricula se puede apreciar que has declarado una llave primera compuesta (una llave primaria puede tener una o varias columnas).

La llave primaria es una restricción, que impide que en la tabla haya filas duplicadas cuyos valores sean iguales en las columnas que componen dicha llave.

Por tanto, si en la tabla matricula tú declaras:

... primary key (cod_est, cod_asig),

le estás diciendo: no me aceptes jamás dos filas con los mismos valores en las columnas cod_est y cod_asig

Supongamos que en la tabla ya existe una fila así:

cod_est        cod_asig
1085           1080

Si tú intentas insertar otra fila con esos dos valores en esas dos columnas, te dará el error que estás teniendo.

Sin embargo, podrás insertar filas como esta:

cod_est        cod_asig
1080           1085
1080           1080
1080           1081
1080           1082
1085           1083

O sea, tienes derecho a una sola fila por cada combinación de cod_est/cod_asig.


¿Qué hago entonces?

Tienes que decidir, en el diseño de tu tabla los registros que deben ser únicos y en base a eso, declarar sea una clave primaria, sea un índice de unicidad.

Por ejemplo:

  • Si por ejemplo lo que no se debe repetir es únicamente cod_est, declaras la restricción así: ... primary key (cod_est), ... ,

En ese caso, podrás tener filas así:

cod_est        cod_asig
1080           1085
1080           1080  --ERROR ya existe un cod_est 1080
1080           1081  --ERROR ya existe un cod_est 1080
1080           1082  --ERROR ya existe un cod_est 1080
1085           1083
1085           1084  --ERROR ya existe un cod_est 1085
1086           1085  
  • En cambio, si fuese cod_asig, declaras la restricción así: ... primary key (cod_asig), ... .

En ese caso, podrás tener filas así:

cod_est        cod_asig
1080           1085
1080           1080  
1080           1081  
1080           1082  
1085           1083
1085           1084
1086           1085  --ERROR ya existe un cod_asig 1085

En el caso de necesitar una combinación de columnas, entonces declaras la restricción como ya la tienes, pero sabiendo que no podrás repetir filas con valores iguales en las columnas que forman parte de la clave primaria.

También, se puede usar un índice de unicidad (UNIQUE) que indique que en la tabla no deberían haber valores repetidos según el criterio indicado en el índice.

Aquí se presenta otro problema (digamos mejor dilema) que quizá pueda ser objeto de una pregunta interesante a plantear aquí mismo si no existe ya: ¿debo usar una llave primaria combinada o un índice único combinado para restringir la duplicidad de datos?

Todo dependerá de la realidad de tu programa y de tus datos. Las restricciones son un elemento fundamental para el funcionamiento de la base de datos y si no se establecen bien, puede causar problemas como la redundancia de datos, lentitud en las consultas, etc.

Espero al menos haber aclarado el problema que estás teniendo ahora, esa es la intención de la respuesta… y abrir el apetito a este mundo maravilloso de las bases de datos y a la decisión importante de cómo establecer las restricciones.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *