![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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 |
#2
|
|||
|
|||
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. |
#3
|
|||
|
|||
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. |
#4
|
|||
|
|||
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. |
#5
|
|||
|
|||
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:
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. |
![]() |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
![]() |
|