Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Problema al insertar registros en una BD (https://www.clubdelphi.com/foros/showthread.php?t=22007)

epalacios 03-06-2005 11:55:27

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

ramiretor 03-06-2005 20:04:46

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

epalacios 06-06-2005 08:42:04

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.

axelbb 07-06-2005 18:11:04

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.

ramiretor 07-06-2005 19:11:16

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


La franja horaria es GMT +2. Ahora son las 10:32:18.

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