Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-06-2005
epalacios epalacios is offline
Miembro
 
Registrado: jun 2003
Posts: 20
Poder: 0
epalacios Va por buen camino
Problema al insertar registros en una BD

Necesito insertar un registro en una BD Oracle y me da el error ORA-02291 integrity constraint (%%%) violated - parent key not found. El registro que inserto contiene un campo a nulo y dicho campo no existe en la tabla en la que se indexa, me explico.

TABLA USUARIO: Tiene un campo clave de 1 a n no nulo además de otros campos..
TABLA TARJETA: Tiene una constraint a la tabla USUARIO con la clave de USUARIO pero en algunas ocasiones se debe insertar un valor nulo en dicho campo.

El caso es que si lo hago desde el dbExplorer con un INSERT INTO TARJETALINEA (clave,null) siendo null la clave de USUARIO no me da ningún problema pero cuando lo hago por código, al Params asociado al campo clave de USUARIO, le paso el método Clear para que me inserte un nulo y cuando ejecuto la Query me da el error anterior.

Espero haberme explicado bien.
¿Alguna solución?
Muchas gracias
Responder Con Cita
  #2  
Antiguo 03-06-2005
ramiretor ramiretor is offline
Miembro
 
Registrado: may 2003
Ubicación: México
Posts: 196
Poder: 21
ramiretor Va por buen camino
Hola:
Está raro que en dbExplorer lo puedas hacer ¿estás seguro de que no deshabilitaste los constraints antes de hacer la inserción con DbExplorer? y si la clave de usuario no puede ser nula ¿ por qué quieres insertar una llave nula en la tabla Tarjeta?

Saludos
__________________
Ernesto R.
Responder Con Cita
  #3  
Antiguo 06-06-2005
epalacios epalacios is offline
Miembro
 
Registrado: jun 2003
Posts: 20
Poder: 0
epalacios Va por buen camino
Seguro, están habilitados.
Si en la tabla TARJETA inserto un registro con la clave usuario a nulo es que dicha tarjeta está sin configurar, es decir, no tiene usuario asignado.
Responder Con Cita
  #4  
Antiguo 07-06-2005
axelbb axelbb is offline
Miembro
 
Registrado: oct 2004
Posts: 127
Poder: 20
axelbb Va por buen camino
Veamos

Creo que lo que Oracle te dice es que insertás un registro en TARJETAS con un código de usuario que no existe en la tabla USUARIOS. Eso sería la violación de clave foránea. La clave nula no tiene por qué ser rechazada con ese mensaje, porque no hace referencia a ninguna otra tabla.

Desde el dbExplorer, le mandás un SQL con los valores a insertar (codigo de usuario, clave nula), y lo acepta bien porque el codigo de usuario (parámetro 1) existe en USUARIOS.

EL SQL de insert en el componente Delphi sería:

insert into TARJETAS values (:Param0,:Param1) o algo así

En Delphi, PARAMS empieza desde 0:

Query1.Params[0].AsInteger := CODIGO DE USUARIO
Query1.Params[1].AsString := Nil (o Params[1].CLEAR ??, no sé)

Otra es usar un SQL especial para cuando la tarjeta no está configurada:
insert into TARJETAS values (:Param0,NULL) (En Oracle es NULL?)
y
Query1.Params[0].AsInteger := CODIGO DE USUARIO

Por supuesto, el orden de los campos en la tabla y en la instrucción debe ser idéntico, y no debería saltar ningún error, y todos los Params y parámetros directos de la instrucción SQL deben tener valor asignado.

No entiendo mucho de esto, si nada que ver, mil disculpas.

Saludos.
Responder Con Cita
  #5  
Antiguo 07-06-2005
ramiretor ramiretor is offline
Miembro
 
Registrado: may 2003
Ubicación: México
Posts: 196
Poder: 21
ramiretor Va por buen camino
A ver

Hola a todos:
Lo que está pasando es que DBExplorer (que es la herramienta con la que el amigo está insertando el registro) no está respetando los constraints, en este caso, la llave foránea, este constraint está para que se respete la integridad referencial entre tablas, si se quiere insertar el registro a la mala, es decir, no respetar el constraint (la llave foránea pues) lo que se tiene que hacer es deshabilitarlo, pero cuidado que eso puede traer problemas más adelante, si no mal recuerdo la sentencia es:

Código SQL [-]
  alter table "Mitabla" modify constraint "nombreConstraint" disable;

y luego insertar el registro y seguir por último habilitando el constraint (pero a mi se me hace que no va a poder levantarlo). En el dado caso ¿por qué no usas un valor - 1 (por ejemplo) en la llave foránea? para que sepas que se trata de registros con esas características

Saludos
__________________
Ernesto R.

Última edición por ramiretor fecha: 07-06-2005 a las 19:15:06.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 10:52:44.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi