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

Problema con un Foreign key

Estas en el tema de Problema con un Foreign key en el foro de Mysql en Foros del Web. Hola a todos/as, Estoy utilizando PHPMyAdmin, que es un Administrador Web de SQL, para crear mi Base de Datos. Ahora mismo, tengo dos tablas y ...
  #1 (permalink)  
Antiguo 10/02/2007, 06:03
 
Fecha de Ingreso: noviembre-2005
Ubicación: Alicante (España)
Mensajes: 242
Antigüedad: 19 años
Puntos: 1
Problema con un Foreign key

Hola a todos/as,

Estoy utilizando PHPMyAdmin, que es un Administrador Web de SQL, para crear mi Base de Datos.

Ahora mismo, tengo dos tablas y quiero relacionarlas por una clave extranjera (Foreign Key) y, a pesar de que la sentencia es válida y el administrador la acepta sin errores, al insertar datos no me mantiene la relación.

Me explico:

Tengo una tabla, FamiliaArticulo, con una clave primaria, CodFamilia, y otra tabla, Articulos, con su clave primaria, codArticulo y otra extranjera, codFamilia.

He utilizado la sentencia:

ALTER TABLE Articulos ADD CONSTRAINT RelacionFamilia FOREIGN KEY (codFamilia) REFERENCES FamiliaArticulo (codFamilia)

para relacionar ambas tablas por el campo codFamilia. De esta forma, cada vez que introduzco un artículo, la Base de Datos debería comprobar que el codFamilia de ese artículo EXISTE en la tabla FamiliaArticulo... Sin embargo no lo hace. Puedo insertar cualquier articulo con cualquier codFamilia que la Base de Datos lo introduce sin queja alguna.

¿Por qué me pasa esto?
¿Cómo puedo garantizar la Integridad de mi base de Datos?

Agradezco cualquier consejo.

Un Saludo.
  #2 (permalink)  
Antiguo 10/02/2007, 06:17
 
Fecha de Ingreso: marzo-2005
Mensajes: 271
Antigüedad: 19 años, 8 meses
Puntos: 1
Re: Problema con un Foreign key

a mi me pasa algo similar, tengo el pack "apache friends" con aopache, php, phpmyadmin y mysql. Segun el manual a partir de la version 5.0 ya se pueden hacer claves ajenas "foreign keys". Yo lo hice y no me respetaba, sobre todo en las actualizaciones qwue era lo que me interesaba. He investigado y parece ser que hay que tener el motor "InnoDB" en mysql. y parecer ser :) que al instalar el pack no puse lo de inndb...

sigo investigando...


http://dev.mysql.com/doc/refman/5.0/...nstraints.html

CREATE TABLE parent(
id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child(
id INT,
parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id)
REFERENCES parent(id)
ON DELETE CASCADE
) ENGINE=INNODB;


http://dev.mysql.com/doc/refman/5.0/...nstraints.html
  #3 (permalink)  
Antiguo 10/02/2007, 07:59
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 19 años
Puntos: 5
Re: Problema con un Foreign key

Es como menciona mandrakeXP, si quieren mantener el uso de llaves foraneas, deben hacer uso del motor InnoDB, por defecto en XAMMP, viene configurado con MyIsam y tienes que habilitar el uso de tablas Innodb (por lo menos la ultima version que vi), la unica diferencia que tendras es que al crear tus tablas deberas agregar ENGINE=INNODB; y con eso bastara para que te realice los controles de restriccion entre tablas padre e hija(s), cya
__________________
"El Conocimiento es de todos, no solo de algunos"
  #4 (permalink)  
Antiguo 11/02/2007, 04:18
 
Fecha de Ingreso: noviembre-2005
Ubicación: Alicante (España)
Mensajes: 242
Antigüedad: 19 años
Puntos: 1
Re: Problema con un Foreign key

He probado lo que me habeis dicho.

He eliminado las tablas y las he vuelto a crear con los ejemplos que indicaba MandrakeXP.

CREATE TABLE Familia(
codFamilia INT NOT NULL,
nombre carchar(15) NOT NULL
PRIMARY KEY (codFamilia)
) ENGINE=INNODB;



CREATE TABLE Articulos(
codArticulo INT NOT NULL,
codFamilia INT NOT NULL,
nombre VARCHAR(30) NOT NULL,
descripcion VARCHAR(100) NOT NULL,
precio FLOAT NOT NULL,
INDEX iCodigoF (codFamilia),
PRIMARY KEY (codArticulo)
FOREIGN KEY (codFamilia)
REFERENCES Familia(codFamilia)
ON DELETE CASCADE
) ENGINE=INNODB;


Las tablas se crean sin problemas y en Articulos aparece un Indice llamado iCodigoF (imagino que tendrá la referencia al campo codFamilia de la tabla Familia).

El problema es que he insertado un registro en la tabla Familia (con idFamilia = 1) y después me permite insertar un registro en la tabla Articulos con idFamilia = 4. ¿Por qué me deja?
Se supone que si me ha aceptado ambas sentencias CREATE con el ENGINE=INNODB es porque lo tengo activado , ¿no?

¿Qué me falta?.

Un Saludo.
  #5 (permalink)  
Antiguo 11/02/2007, 07:49
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 19 años
Puntos: 5
Re: Problema con un Foreign key

Pues te dire que probe el codigo que pusiste en el post (claro corrigiendo los errores que tenia), y funcionaba y controlaba las restricciones, aqui te dejo el codigo:
Código PHP:
CREATE TABLE Familia(
codFamilia INT NOT NULL,
nombre varchar(15NOT NULL,
PRIMARY KEY (codFamilia)
ENGINE=INNODB;


CREATE TABLE Articulos(
codArticulo INT NOT NULL,
codFamilia INT NOT NULL,
nombre VARCHAR(30NOT NULL,
descripcion VARCHAR(100NOT NULL,
precio FLOAT NOT NULL,
PRIMARY KEY (codArticulo),
INDEX iCodigoF (codFamilia),
FOREIGN KEY (codFamiliaREFERENCES Familia(codFamiliaON DELETE CASCADE
ENGINE=INNODB
ahora tal vez el problema radica en que no tienes habilitado el motor innodb, por que no haces un:
Código PHP:
mysqlSHOW CREATE TABLE FamiliaG;
CREATE TABLE `familia` (
  `
codFamiliaint(11NOT NULL,
  `
nombrevarchar(15NOT NULL,
  
PRIMARY KEY  (`codFamilia`)
ENGINE=InnoDB DEFAULT CHARSET=utf8 
con eso veras si realmente se crearon las tablas como InnoDB, saludos, suerte, cya
__________________
"El Conocimiento es de todos, no solo de algunos"
  #6 (permalink)  
Antiguo 11/02/2007, 17:20
 
Fecha de Ingreso: noviembre-2005
Ubicación: Alicante (España)
Mensajes: 242
Antigüedad: 19 años
Puntos: 1
Re: Problema con un Foreign key

Pues creo que tienes razón deadlykyo!!

He utilizado la sentencia SHOW CREATE TABLE FAMILIAS

y me ha respondido:

CREATE TABLE `familias` (\n `codFamilia` int(11) NOT NULL,\n `nombre` varchar(15) NOT NULL,\n PRIMARY KEY (`codFamilia`)\n) ENGINE=MyISAM DEFAULT CHARSET=latin1


A parte he utilizado la sentencia SHOW VARIABLES LIKE '%innodb%'

y me dice que está desactivado:

have_innodb DISABLED
innodb_additional_mem_pool_size 1048576
innodb_autoextend_increment 8
innodb_buffer_pool_awe_mem_mb 0
innodb_buffer_pool_size 8388608
innodb_checksums ON
innodb_commit_concurrency 0
innodb_concurrency_tickets 500
innodb_data_file_path
innodb_data_home_dir
innodb_doublewrite ON
innodb_fast_shutdown 1
innodb_file_io_threads 4
innodb_file_per_table OFF
innodb_flush_log_at_trx_commit 1
innodb_flush_method
innodb_force_recovery 0
innodb_lock_wait_timeout 50
innodb_locks_unsafe_for_binlog OFF
innodb_log_arch_dir
innodb_log_archive OFF
innodb_log_buffer_size 1048576
innodb_log_file_size 5242880
innodb_log_files_in_group 2
innodb_log_group_home_dir
innodb_max_dirty_pages_pct 90
innodb_max_purge_lag 0
innodb_mirrored_log_groups 1
innodb_open_files 300
innodb_support_xa ON
innodb_sync_spin_loops 20
innodb_table_locks ON
innodb_thread_concurrency 20
innodb_thread_sleep_delay 10000


¿Cómo activo el ENGINE = INNODB?

¿Se hace por código o es algo configurable desde el PHPMYADMIN?


Un Saludo

Última edición por Tarzan; 11/02/2007 a las 17:38
  #7 (permalink)  
Antiguo 11/02/2007, 20:26
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 19 años
Puntos: 5
Re: Problema con un Foreign key

Bueno, primero aclarar que phpmyadmin solo es una interfaz web para la administración de mysql, si quieres cambiar algo en la configuracion de mysql deberas hacerlo en el archivo my.cnf o my.ini, deberas comentar la linea que dice : skip-innodb, para comentar solo agregas el signo # por delante y puedes descomentar las demas lineas, deberias quedarte algo asi
Código:
#*** INNODB Specific options ***

#skip-innodb

innodb_additional_mem_pool_size=2M

innodb_flush_log_at_trx_commit=1

innodb_log_buffer_size=1M

innodb_buffer_pool_size=8M

innodb_log_file_size=10M

innodb_thread_concurrency=8
mejor explicado, esta en la documentacion de mysql, aqui te dejo un enlace para que lo leas a mas detalle, despues de realizar los cambios reinicias el servicio y con eso deberias poder crear tablas InnoDB sin problemas, saludos, cya

http://dev.mysql.com/doc/refman/5.0/...iguration.html
__________________
"El Conocimiento es de todos, no solo de algunos"
  #8 (permalink)  
Antiguo 12/02/2007, 01:26
 
Fecha de Ingreso: noviembre-2005
Ubicación: Alicante (España)
Mensajes: 242
Antigüedad: 19 años
Puntos: 1
Re: Problema con un Foreign key

Muchísimas gracias deadlykyo!!,

Sólo una última cosilla. He abierto el archivo my.ini, situado en la carpeta windows, y he visto que tengo la línea skip-innodb sin comentar.

La he comentado como tú me has dicho pero me he fijado que no tengo el resto de líneas:

innodb_additional_mem_pool_size=2M

innodb_flush_log_at_trx_commit=1

innodb_log_buffer_size=1M

innodb_buffer_pool_size=8M

innodb_log_file_size=10M

innodb_thread_concurrency=8


¿Las puedo escribir yo, sin más?.. Lo pregunto porque me indicabas que las descomentara y no sé si, al no tenerlas, puedo yo escribirlas o deberían añadirse instalando algo.

Y por último, aunque pueda resultar muy tonto, ¿Cómo vuelvo a activar el servicio?... ¿Vale con reiniciar el equipo o hay algún archivo exe o bat que ejecutar?

Muchísimas gracias por la ayuda que me estás prestando!!

Un Saludo.
  #9 (permalink)  
Antiguo 12/02/2007, 06:41
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 19 años
Puntos: 5
Re: Problema con un Foreign key

Bueno puedes escribirlas o copiarlas asi no mas, no hay ningun problema no te afectara en nada, ahora para reiniciar el servicio (supongo que estas en windows XP), puedes entrar a inicio->ejecutar y ahi pones services.msc y dentro de la ventana que se abra buscas mysql y ahi tienes la opcion de reiniciar, detener e iniciar, pero tambien sirve si reinicias tu equipo, saludos, cya
__________________
"El Conocimiento es de todos, no solo de algunos"
  #10 (permalink)  
Antiguo 12/02/2007, 10:51
 
Fecha de Ingreso: noviembre-2005
Ubicación: Alicante (España)
Mensajes: 242
Antigüedad: 19 años
Puntos: 1
Re: Problema con un Foreign key

Deadlykyo,

He cambiado el archivo my.ini situado en la carpeta windows como me has dicho. Este es el que tengo:

#This File was made using the WinMySQLAdmin 1.3 Tool
#25/8/2003 8:50:22
#Uncomment or Add only the keys that you know how works.
#Read the MySQL Manual for instructions

[mysqld]
skip-locking

#skip-innodb
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=8M
innodb_log_file_size=10M
innodb_thread_concurrency=8

set-variable = max_connections=16384
default-character-set=latin1
basedir=c:\UTILID~1\WEB/mysql
#bind-address=
datadir=c:\UTILID~1\WEB/mysql/data
#language=C:/AppServ/mysql/share/your language directory
#slow query log#=
#tmpdir#=
#port=3306
#set-variable=key_buffer=16M
[client]
default-character-set=latin1
[WinMySQLadmin]
user=mysql
password=Valencia


Luego he reiniciado el servicio tal y como me has explicado.

Pero, cuando he entrado en el phpMyAdmin y he escrito la sentencia:

SHOW VARIABLES LIKE '%innodb%'

Me sigue diciendo que el innodb esta desactivado!!!

have_innodb DISABLED
innodb_additional_mem_pool_size 2097152
innodb_autoextend_increment 8
innodb_buffer_pool_awe_mem_mb 0
innodb_buffer_pool_size 8388608
innodb_checksums ON
innodb_commit_concurrency 0
innodb_concurrency_tickets 500
innodb_data_file_path ibdata1:10M:autoextend
innodb_data_home_dir
innodb_doublewrite ON
innodb_fast_shutdown 1
innodb_file_io_threads 4
innodb_file_per_table OFF
innodb_flush_log_at_trx_commit 1
innodb_flush_method
innodb_force_recovery 0
innodb_lock_wait_timeout 50
innodb_locks_unsafe_for_binlog OFF
innodb_log_arch_dir
innodb_log_archive OFF
innodb_log_buffer_size 1048576
innodb_log_file_size 10485760
innodb_log_files_in_group 2
innodb_log_group_home_dir .\
innodb_max_dirty_pages_pct 90
innodb_max_purge_lag 0
innodb_mirrored_log_groups 1
innodb_open_files 300
innodb_support_xa ON
innodb_sync_spin_loops 20
innodb_table_locks ON
innodb_thread_concurrency 8
innodb_thread_sleep_delay 10000


y las tablas de las bases de datos no cogen el ENGINE=INNODB
SHOW CREATE TABLE FAMILIAS


CREATE TABLE `familias` (\n `codFamilia` int(11) NOT NULL,\n `nombre` varchar(15) NOT NULL,\n PRIMARY KEY (`codFamilia`)\n) ENGINE=MyISAM DEFAULT CHARSET=latin1


¿Qué me puede faltar?... Lamento ser tan pesado con el tema.

Un saludo.
  #11 (permalink)  
Antiguo 12/02/2007, 11:20
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 19 años
Puntos: 5
Re: Problema con un Foreign key

donde tienes que modificar es el directorio donde esta instalado tu mysql, ahi debe haber un archivo my.ini y de ahi lo copias a la carpeta windows, si usas algun paquete, como appserv, xampp, fosxerv, etc, lo mas seguro que este dentro del directorio donde instalaste estos paquetes, si instalaste mysql por separado deberia estar dentro de archivos de program o program files, en la carpeta mysql, como te digo todo depende donde este instalado el mysql, saludos, cya
__________________
"El Conocimiento es de todos, no solo de algunos"
  #12 (permalink)  
Antiguo 12/02/2007, 11:52
 
Fecha de Ingreso: noviembre-2005
Ubicación: Alicante (España)
Mensajes: 242
Antigüedad: 19 años
Puntos: 1
Re: Problema con un Foreign key

Muchísmas gracias deadlykyo!!

Ya funciona... Ya funcionaaaaaa!!

Suerte que este foro tiene gente tan entendida y con ganas de ayudar como tú.

Un Saludo.
  #13 (permalink)  
Antiguo 31/07/2007, 19:52
 
Fecha de Ingreso: julio-2007
Mensajes: 3
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: Problema con un Foreign key

Cita:
Iniciado por deadlykyo Ver Mensaje
donde tienes que modificar es el directorio donde esta instalado tu mysql, ahi debe haber un archivo my.ini y de ahi lo copias a la carpeta windows, si usas algun paquete, como appserv, xampp, fosxerv, etc, lo mas seguro que este dentro del directorio donde instalaste estos paquetes, si instalaste mysql por separado deberia estar dentro de archivos de program o program files, en la carpeta mysql, como te digo todo depende donde este instalado el mysql, saludos, cya
Hola deadlykyo. Mira, yo tengo un problema parecido. He estado intentando los mismos pasos que Tarzan, pero no puedo solucionar mi problema. Yo instalé el paquete appserver. MySql ver 5.0.16-nt es la que tengo. Creé unas tablas con el phpMyAdmin, pero sólo me muestra opciones de table MyIsam, no así las InnoDB. Al hacer la consulta SHOW VARIABLES...... me indica que INNODB está DISABLED.
De ahí que te digo que mi problema es parecido al de Tarzán. En la última parte tú le indicaste que debería copiar el my.ini que se encuentra dentro del directorio donde se ha instalado el mysql. Yo no lo encuentro ahí, únicamente lo tengo en la carpeta C:\Windows. Me podrías ayudar?
  #14 (permalink)  
Antiguo 31/07/2007, 20:13
 
Fecha de Ingreso: julio-2007
Mensajes: 3
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: Problema con un Foreign key

Este servidor MySQL no es compatible con el motor de almacenamiento InnoDB.

Directorio raíz de los datos
Archivos de datos
Incremente el valor AUTOEXTEND 8
Tamaño de la memoria (búfer) de tránsito común 8,192 KB


ESTA INDICACION HE ENCONTRADO INVESTIGANDO CON EL PHP MY ADMIN, no sé si servirá de algo este comentario
  #15 (permalink)  
Antiguo 02/08/2007, 21:12
 
Fecha de Ingreso: julio-2007
Mensajes: 3
Antigüedad: 17 años, 4 meses
Puntos: 0
De acuerdo Re: Problema con un Foreign key

Hola...

Yo stoy usando Mysql Front y trae habilitado tanto como InnoDB como MyISAM, solo que como default trae MyISAM, el programa que les dijo que se llama MySql Front ayuda demasiado, lo hace todo en forma gráfica, pero el chiste no es que lo haga un programa de forma gráfica sino que aprendamos, así que con msdos de windows desde ahi le di instrucciones al mysql para que me creara la tablas tablas con las llaves foráneas correspondientes, AMBAS tablas las que starán vinculadas por la llave foránea deben de ser de tipo InnoDB, así como nuestro amigo nos dijo con el siguiente ejemplo:

CREATE TABLE Familia(
codFamilia INT NOT NULL,
nombre varchar(15) NOT NULL,
PRIMARY KEY (codFamilia)
) ENGINE=INNODB;


CREATE TABLE Articulos(
codArticulo INT NOT NULL,
codFamilia INT NOT NULL,
nombre VARCHAR(30) NOT NULL,
descripcion VARCHAR(100) NOT NULL,
precio FLOAT NOT NULL,
PRIMARY KEY (codArticulo),
INDEX iCodigoF (codFamilia),
FOREIGN KEY (codFamilia) REFERENCES Familia(codFamilia) ON DELETE CASCADE
) ENGINE=INNODB;

// ENGINE=INNODB deberá ir fuera de la consulta CREATE() ENGINE=INNODB; de esta manera se logra que las tablas queden con ese tipo y por ende las tablas lograrán asimilar que deseamos establecer llaves foráneas. En c:windows ya viene el archivo my.ini y viene sin comentarios ambos.
  #16 (permalink)  
Antiguo 24/11/2007, 21:20
 
Fecha de Ingreso: marzo-2006
Ubicación: Medellín
Mensajes: 93
Antigüedad: 18 años, 8 meses
Puntos: 0
Re: Problema con un Foreign key

Bueno... para los que todavia estan peleando en como habilitar el motor de almacenamiento InnoDB y que tienen instalado como paquete de Servidor XAMPP y por mas que buscan no encuentran el archivo my.cnf de MySQL 5.0.... aqui esta la solucion:

Bajo windows XP, el archivo my.cnf se encuentra en C:\xampp\mysql\bin este archivo aparece con un icono de un PC y como si fuera un acceso directo, lo que deben hacer es abrirlo para editarlo, para poder hacer esto debemos cambiar su extension por ejemplo a .TXT, para tal fin lo que hice fue comprimir este archivo con WinRAR, luego abri el archivo comprimido, y dentro de este archivo debemos encontrar my.cnf, le damos click derecho y dentro de las opciones que nos muestra WinRAR elegimos "Renombrar".. cambiamos su extension a .TXT y luego descomprimimos el archivo en el mismo directorio donde se encuentra originalmente el archivo.

Abrimos my.txt, descomentariamos las lineas que ya mencionaron anteriormente..

#*** INNODB Specific options ***

#skip-innodb

innodb_additional_mem_pool_size=2M

innodb_flush_log_at_trx_commit=1

innodb_log_buffer_size=1M

innodb_buffer_pool_size=8M

innodb_log_file_size=10M

innodb_thread_concurrency=8

guardamos... y luego borramos my.cnf, luego renombramos my.txt por my.cnf y listo.... por ultimo vamos a c:\windows\my.ini lo abrimos y le agregamos o cambiamos las mismas lineas que anteriormente mencionamos.

NOTA: Recuerden parar el servicio Apache y MySQL antes de iniciar el proceso.

PD: Thankx a Diego por la clave de renombra el archivo.........
__________________
"Conocimiento adquirido y no compartido se perderá para siempre" :cool:
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 13:58.