Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Problema con clave ajena

Estas en el tema de Problema con clave ajena en el foro de Bases de Datos General en Foros del Web. Tengo por un lado mi tabla Clientes con sus campos correspondientes: CREATE TABLE Clientes( idClienteCHAR( 9 ) PRIMARY KEY , nombreCliente VARCHAR( 20 ) , ...
  #1 (permalink)  
Antiguo 01/07/2015, 04:14
 
Fecha de Ingreso: agosto-2014
Mensajes: 30
Antigüedad: 9 años, 8 meses
Puntos: 0
Problema con clave ajena

Tengo por un lado mi tabla Clientes con sus campos correspondientes:

CREATE TABLE Clientes(
idClienteCHAR( 9 ) PRIMARY KEY ,
nombreCliente VARCHAR( 20 ) ,
primerApellidoCliente VARCHAR( 20 ) ,
segundoApellidoCliente VARCHAR( 20 ) ,
fechaNacimientoCliente DATE
)

Quiero crear la tabla ContactoCliente. Los registros de esta nueva tabla tendrán una clave primaria compuesta por dos campos. El primero el idCliente y el segundo el tipoContacto (movil, fijo, email, etc), además habrá un tercer campo con la dirección de contacto (el número de teléfono, email o lo que sea).


Create table ContactoCliente
(Fk_idCliente char(9),
tipoContacto varchar(8),
valorContacto varchar(15),
Constraint fk_Cliente foreign key(Fk_idCliente) references Clientes (idCliente),
primary key (Fk_idCliente, tipoContacto)
)

Mi problema es que no existe integridad referencial. Yo quiero que no sea posible crear un registro en la tabla contactoCliente a menos que Fk_idCliente ya exista en la tabla Clientes. No me funciona. Gracias de antemano.
  #2 (permalink)  
Antiguo 01/07/2015, 04:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con clave ajena

En primer lugar, si las tablas tienen datos, debes verificar si la relación se cumple en este momento para todos los registros. Podría haber al menos uno donde no se cumple y así no te dejará crear la FK.
Si no hay datos, no debería haber problemas, excepto que uses MySQL y tablas de tipo MyISAM, donde las FK no existen.
Por otro lado no nos dices que es lo que no funciona, por ejemplo si da un error. Decir que no funciona , no es información útil. Pero por lo pronto yo te diría que pongas la cláusula de la FK al final, después de la PK y no antes.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 01/07/2015, 05:24
 
Fecha de Ingreso: agosto-2014
Mensajes: 30
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Problema con clave ajena

Yo quiero que no sea posible crear un registro en la tabla contactoCliente a menos que Fk_idCliente ya exista en la tabla Clientes.

Eso es lo que no funciona. Ambas tablas están vacías. En principio yo no debería ser capaz de crear un registro en la tabla contactoClientes a menos que rellene el campo fk_idCliente con un valor ya existente en el campo idCliente de la tabla Clientes, estoy equivocado? Pues ahí está el error. Incluso estando ambas tablas completamente vacías... puedo crear un registro en la tabla contactoCliente que tenga como fk_idCliente un valor que no corresponde a ningún registro de la tabla Clientes (la misma no tiene ninguno todavía).

Creo esta segunda tabla, contactoClientes, teniendo Clientes sin registro alguno. Estoy usando phpmyadmin. No ves ningún otro posible error? Gracias.

EDITO:

Tenías razón, no entendí en un principio lo de MyISAM, porque como es algo de lo que yo ni siquiera había oído hablar, pensé que no podía tener nada que ver con mi problema. Me posicioné en mi tabla contactoClientes y como motor de almacenamiento tengo MyISAM. Supongo que me viene así por defecto... He estado leyendo y al parecer tengo que cambiarlo y elegir innoDB. Lamentablemente entre las opciones que me aparecen como motor de almacenamiento no hay ningún innoDB. Memory, blackhole, archive, federated... pero ningún innoDB. Alguna idea de cuál debería elegir? Gracias.

Última edición por Lentorro; 01/07/2015 a las 05:52
  #4 (permalink)  
Antiguo 01/07/2015, 06:03
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con clave ajena

Cita:
Tenías razón, no entendí en un principio lo de MyISAM, porque como es algo de lo que yo ni siquiera había oído hablar, pensé que no podía tener nada que ver con mi problema. Me posicioné en mi tabla contactoClientes y como motor de almacenamiento tengo MyISAM. Supongo que me viene así por defecto... He estado leyendo y al parecer tengo que cambiarlo y elegir innoDB. Lamentablemente entre las opciones que me aparecen como motor de almacenamiento no hay ningún innoDB. Memory, blackhole, archive, federated... pero ningún innoDB. Alguna idea de cuál debería elegir? Gracias.
Eso significa que no lo tienes activado. Si estás trabajando en tu PC y no en un servidor externo, la pregunta principal sería qué versión de MySQL tienes, porque desde la versión 5.0.x, MySQL viene con el motor InnoDB activado y como motor de tablas por default.
Si estás trabajando en un servidor externo y no en tu PC, sólo el administrador del servidor puede activar el motor InnoDB.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 01/07/2015, 06:50
 
Fecha de Ingreso: agosto-2014
Mensajes: 30
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Problema con clave ajena

Versión 5.0. Ya lo activé. Por si alguien tiene el mismo problema:

Carpeta MySQL, abrir el archivo my.ini, encontrar la línea que dice skip-innoDB y ponerle delante un "gato". #skip-innodb. Eso es todo.

Gracias por la ayuda, compañero.
  #6 (permalink)  
Antiguo 01/07/2015, 07:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con clave ajena

¿"Gato"?

En mi vida había visto que al signo de numeral se le diga "gato"...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: ajena, clave, registros, tabla, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:34.