Oracle - Claves Unicas me permiten duplicidad de Datos en Oracle

 
Vista:

Claves Unicas me permiten duplicidad de Datos en Oracle

Publicado por Isaac López (1 intervención) el 20/08/2014 10:32:27
Que tal colegas los vengo a molestar en esta oportunidad con el siguiente problema:

en un proyecto de la Universidad me piden una restricción para que el mismo día un usuario no pueda hacer 2 solicitudes de un mismo curso mas si en otra fecha solicitar de nuevo algo del mismo curso y se me ocurrio hacerla por medio de una clave única, la tabla me queda así

CREATE TABLE "Solicitud"
( "IDSolicitud" NUMBER(*,0) NOT NULL ENABLE,
"PaginaIni" NUMBER(*,0) NOT NULL ENABLE,
"PaginaFin" NUMBER(*,0) NOT NULL ENABLE,
"CostoUnit" NUMBER(10,2) NOT NULL ENABLE,
"NombrePropieetario" VARCHAR2(30) NOT NULL ENABLE,
"IDCurso" NUMBER(*,0),
"IDUsuario" NUMBER(*,0),
"IDTipoFotocopia" NUMBER(*,0),
"IDEmpresa" NUMBER(*,0),
"CANTIDAD" NUMBER(10,0) NOT NULL ENABLE,
"FECHA" DATE NOT NULL ENABLE,
CONSTRAINT "Key11" PRIMARY KEY ("IDSolicitud") ENABLE,
CONSTRAINT "UQ_FECHA_CURSO_USUARIO" UNIQUE ("FECHA", "IDUsuario", "IDCurso") ENABLE
) ;ALTER TABLE "Solicitud" ADD CONSTRAINT "Relationship26" FOREIGN KEY ("IDCurso")
REFERENCES "Cursos" ("IDCurso") ENABLE;ALTER TABLE "Solicitud" ADD CONSTRAINT "Relationship27" FOREIGN KEY ("IDUsuario")
REFERENCES "Usuario" ("IDUsuario") ENABLE;ALTER TABLE "Solicitud" ADD CONSTRAINT "Relationship28" FOREIGN KEY ("IDTipoFotocopia")
REFERENCES "TipoFotocopia" ("IDTipoFotocopia") ENABLE;ALTER TABLE "Solicitud" ADD CONSTRAINT "Relationship37" FOREIGN KEY ("IDEmpresa")
REFERENCES "Empresa" ("IDEmpresa") ENABLE;

esta es la restricción que ya esta en la tabla:

CONSTRAINT "UQ_FECHA_CURSO_USUARIO" UNIQUE ("FECHA", "IDUsuario", "IDCurso") ENABLE

Pero me vengo a topar con la bromita de oracle que siempre me deja meter los tres campos iguales (yo esperaba que al validar que en una fecha un mismo usuario solicito mas de 1 vez el mismo curso me lo impidiera) pero ya intenté por consola, por query y por modo gráfico y de todas maneras me deja insertar los datos

cabe resaltar que la fecha en la tabla se inserta automáticamente por medio de un trigger y se la asigne de la siguiente manera :NEW.FECHA= SYSDATE;

Estoy en Oracle 11g

El Campo FECHA es DATE y según yo DATE solo maneja año, mes y día sin horas, tendrán ustedes alguna solicíon?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Claves Unicas me permiten duplicidad de Datos en Oracle

Publicado por luis (235 intervenciones) el 20/08/2014 18:38:41
Pues creo que lo que escribes es una bromita, oracle no te hace bromitas.

Preguntas (espero que las respondas):

1- Haz consultado los datos que se están registrando en la BD??
2.- Si dices:
"El Campo FECHA es DATE y según yo DATE solo maneja año, mes y día sin horas, tendrán ustedes alguna solicíon?"

Bueno "segun tu" estas mal, si tienes dudas debiste revizar la info de oracle o en ultimo caso crear una tablita de uin solo campo e insertar vario registros "insert into tabla1 values (sysdate)" y ver que valores inserta.

Te informo que el sysdate muestra la fecha con año minutos y segundos:

EjeMPLO;:

SELECT to_char(SYSDATE,'dd/mm/yyyy HH24:MM:SS') FROM DUAL;

Que es lo que retorna?? es magia o que??

Hay que investigar un poco mas con cosas elementales no... y si tienes dudas "según tu" revisar los datos que creas en tus tablas.

Saludos

Luis Pablo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Claves Unicas me permiten duplicidad de Datos en Oracle

Publicado por Isaac López (2 intervenciones) el 20/08/2014 20:09:42
pues efectivamente tal y como lo decis, en la bd solo se refleja la inserción del año, mes y día, no se refleja que se esten manejando ni horas ni segundos

pero por lo que veo Date si permite horas y segundos aunque no los muestre
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Claves Unicas me permiten duplicidad de Datos en Oracle

Publicado por luis (235 intervenciones) el 20/08/2014 21:18:55
Esto es lo que dice oracle, no hay que inventar nada ni suponer nada:

--------------------------------------------------------------------------------------------------
Overview of DATE Datatype

The DATE datatype stores point-in-time values (dates and times) in a table. The DATE datatype stores the year (including the century), the month, the day, the hours, the minutes, and the seconds (after midnight).

Oracle Database can store dates in the Julian era, ranging from January 1, 4712 BCE through December 31, 9999 CE (Common Era, or 'AD'). Unless BCE ('BC' in the format mask) is specifically used, CE date entries are the default.

Oracle Database uses its own internal format to store dates. Date data is stored in fixed-length fields of seven bytes each, corresponding to century, year, month, day, hour, minute, and second.

For input and output of dates, the standard Oracle date format is DD-MON-YY, as follows:

'13-NOV-92'
You can change this default date format for an instance with the parameter NLS_DATE_FORMAT. You can also change it during a user session with the ALTER SESSION statement. To enter dates that are not in standard Oracle date format, use the TO_DATE function with a format mask:

TO_DATE ('November 13, 1992', 'MONTH DD, YYYY')
Oracle Database stores time in 24-hour format—HH:MI:SS. By default, the time in a date field is 00:00:00 A.M. (midnight) if no time portion is entered. In a time-only entry, the date portion defaults to the first day of the current month. To enter the time portion of a date, use the TO_DATE function with a format mask indicating the time portion, as in:

INSERT INTO birthdays (bname, bday) VALUES
('ANDY',TO_DATE('13-AUG-66 12:56 A.M.','DD-MON-YY HH:MI A.M.'));

--------------------------------------------------------------------------------------------------

Saludos

Luis.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Claves Unicas me permiten duplicidad de Datos en Oracle

Publicado por luis (235 intervenciones) el 20/08/2014 21:23:33
Que lo veas en el formato como quieres verlo es una cosa, otra cosa es lo que realmente se guarda.

Realiza lo siguiente:

Insert into tabla1 (campo1)
values (sysdate);

commit;

--Luego de 5 minutos realiza otro insert :

Insert into tabla1 (campo1)
values (sysdate);

commit;

Luego realiza lo siguiente :

Select to_char( campo1 ,'dd/mm/yyyy hh24:mi:ss' ) fecha from tabla1 ;

Y veras los datos que se guardaron formateados segun el formato que yo estoy colocando (formato de fecha y hora en formato de 24 horas).

Saludos

Luis.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Claves Unicas me permiten duplicidad de Datos en Oracle

Publicado por Alixandro (63 intervenciones) el 28/08/2014 03:48:35
Issac los campos tipos date en Oracle se almacenan como día mes año hora minuto segundo y milésima de segundo si solo quieres almacenar la fecha debes truncala eje. Trunc (sysdate). Te exhortó a que investigue sobre los tipos de datos en Oracle. Su característica como y como funcionan. Además puedes crear llaves única de función que solo se cumpla cuando se cumpla sienta condición
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Claves Unicas me permiten duplicidad de Datos en Oracle

Publicado por Isaac López (2 intervenciones) el 28/08/2014 04:55:01
Gracias a todos por sus comentarios, ya encontre como solucionaar este problema siempre con claves únicas, limite el formato de la fecha, si recibo un mmddyyyyhhmmss

solo permiti que en el campo donde almaceno la fecha se almacene un formato mmddyyyy y con eso basto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar