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

Ayuda esto es extraño.

Estas en el tema de Ayuda esto es extraño. en el foro de Mysql en Foros del Web. Creo las tablas con : DROP TABLE IF EXISTS `categorias`; CREATE TABLE `categorias` ( id_categoria int (11) NOT NULL auto_increment, titulo varchar (64) NOT NULL, ...
  #1 (permalink)  
Antiguo 05/03/2008, 11:48
 
Fecha de Ingreso: diciembre-2007
Mensajes: 149
Antigüedad: 16 años, 3 meses
Puntos: 1
Ayuda esto es extraño.

Creo las tablas con :

DROP TABLE IF EXISTS `categorias`;
CREATE TABLE `categorias` (
id_categoria int (11) NOT NULL auto_increment,
titulo varchar (64) NOT NULL,
descripcion text NOT NULL default '',
PRIMARY KEY(`id_categoria`)
)ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;

DROP TABLE IF EXISTS `subcategorias`;
CREATE TABLE `subcategorias` (
id_subcategoria int (11) NOT NULL auto_increment,
id_categoria int (11),
titulo varchar (64) NOT NULL,
titulo_categoria varchar (64) NOT NULL,
descripcion text NOT NULL,
PRIMARY KEY (`id_subcategoria`),
FOREIGN KEY (`id_categoria`) REFERENCES `categorias`(`id_categoria`) ON UPDATE CASCADE ON DELETE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;


DROP TABLE IF EXISTS `banner`;
CREATE TABLE `banner` (
idbanner int (11) NOT NULL auto_increment,
anunciante varchar (100) default NULL,
banner varchar (100) default NULL,
url varchar (255) default NULL,
hits int (11) unsigned default NULL,
orden int (11) NOT NULL default '999',
estado tinyint (3) unsigned default '0',
PRIMARY KEY(`idbanner`)
)ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;

DROP TABLE IF EXISTS `clientes`;
CREATE TABLE `clientes` (
id_cliente int (11) NOT NULL auto_increment,
empresa varchar (64) NOT NULL,
cif varchar (9) NOT NULL,
nombre varchar (64) NOT NULL,
apellido_1 varchar (64) NOT NULL,
apellido_2 varchar (64) NOT NULL,
razon_social char (32) NOT NULL,
direccion varchar (32) NOT NULL,
cp int (9) unsigned NOT NULL,
localidad varchar (32) NOT NULL,
provincia varchar (32) NOT NULL,
telefono int (32) NOT NULL,
web varchar (255) default NULL,
email varchar (50) NOT NULL,
modalidad char (30) NOT NULL,
duracion int (12) NOT NULL,
fecha date NOT NULL,
forma_de_pago varchar (50) default NULL,
precio_edicion int (11) unsigned default NULL,
iva int (11) unsigned default '0',
importe_total int (32) unsigned default '0',
banco int (32) default NULL,
sucursal int (32) default NULL,
dc int (2) default NULL,
cc int (32) default NULL,
estado tinyint (3) unsigned default '0',
PRIMARY KEY(`id_cliente`)
)ENGINE=InnoDB CHARSET=latin1 AUTO_INCREMENT=0 ;

DROP TABLE IF EXISTS `eventos`;
CREATE TABLE `eventos` (
id_evento int (11) NOT NULL auto_increment,
id_cliente int (11),
id_subcategoria int (11),
titulo varchar (64) NOT NULL,
descripcion text NOT NULL,
titulo_subcategoria varchar (64) NOT NULL,
tipo_evento varchar (64) NOT NULL,
fecha_inicio date NOT NULL,
fecha_final date,
lugar_celebracion text NOT NULL default '',
precio_entrada int (32) unsigned default '0',
email varchar (32) NOT NULL,
telefono varchar (32) NOT NULL,
hora_inicio time,
hora_final time,
imagen varchar (32) NOT NULL default '',
estado tinyint (3) unsigned default '0',
nombre_cliente varchar (64) NOT NULL,
apellido_1_cliente varchar (64) NOT NULL,
apellido_2_cliente varchar (64) NOT NULL,
PRIMARY KEY(`id_evento`),
FOREIGN KEY (`id_cliente`) REFERENCES `clientes` (`id_cliente`) ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (`id_subcategoria`) REFERENCES `subcategorias` (`id_subcategoria`) ON UPDATE CASCADE ON DELETE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;

Y luego al mirar el tipo de tabla listandolas con mysqladmin me salen de tipo MyISAM.

Vamos como si no hiciese nada mi version de php es:

Client API version 3.23.49
  #2 (permalink)  
Antiguo 06/03/2008, 09:26
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, 4 meses
Puntos: 2658
Re: Ayuda esto es extraño.

Poner el valor inicial para AUTO_INCREMENT en la creación de la tabla sólo funciona para tablas MyISAM y MEMORY, probablemente el motor esté cambiando el tipo para darles soporte.
A pesar de eso se supone que el MySQL 5.0 le da soporte en InnoDB, simplemente que ignora la cláusula al momento de ejecución.
  #3 (permalink)  
Antiguo 06/03/2008, 10:19
 
Fecha de Ingreso: diciembre-2007
Mensajes: 149
Antigüedad: 16 años, 3 meses
Puntos: 1
Sonrisa Re: Ayuda esto es extraño.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Poner el valor inicial para AUTO_INCREMENT en la creación de la tabla sólo funciona para tablas MyISAM y MEMORY, probablemente el motor esté cambiando el tipo para darles soporte.
A pesar de eso se supone que el MySQL 5.0 le da soporte en InnoDB, simplemente que ignora la cláusula al momento de ejecución.
Ajam y es raro porque en mi servidor externo si me funciona.... El caso que si peude ser eso. una pregunta mas, he cambiado un poco la estructura de las tablas:

DROP TABLE IF EXISTS `categorias`;
CREATE TABLE `categorias` (
titulo varchar (64) NOT NULL,
descripcion text NOT NULL default '',
PRIMARY KEY(`titulo`)
)ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;

DROP TABLE IF EXISTS `subcategorias`;
CREATE TABLE `subcategorias` (
titulo varchar (64) NOT NULL,
titulo_categoria varchar (64) NOT NULL,
descripcion text NOT NULL,
PRIMARY KEY (`titulo`),
FOREIGN KEY (`titulo`) REFERENCES `categorias`(`titulo`) ON UPDATE CASCADE ON DELETE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;

DROP TABLE IF EXISTS `eventos`;
CREATE TABLE `eventos` (
titulo varchar (64) NOT NULL,
descripcion text NOT NULL,
titulo_subcategoria varchar (64) NOT NULL,
fecha_inicio date NOT NULL,
fecha_final date,
lugar_celebracion text NOT NULL default '',
precio_entrada int (32) unsigned default '0',
email varchar (32) NOT NULL,
telefono varchar (32) NOT NULL,
hora_inicio time,
hora_final time,
imagen varchar (32) NOT NULL default '',
estado tinyint (3) unsigned default '0',
PRIMARY KEY(`titulo`),
FOREIGN KEY (`titulo_subcategoria`) REFERENCES `subcategorias` (`titulo`) ON UPDATE CASCADE ON DELETE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;

Y a la hora de insertar una nueva catgoría me aparece esto:

Failed to execute SQL: INSERT INTO `subcategorias` (`titulo`,`descripcion`,`titulo_categoria`) VALUES ('daaa','aa','cat1'). Error: Cannot add or update a child row: a foreign key constraint fails

Me puedes hechar una mano colega :( ?
  #4 (permalink)  
Antiguo 06/03/2008, 17:57
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, 4 meses
Puntos: 2658
Re: Ayuda esto es extraño.

Bueno, eso es más sencillo. La clave 'daaa' no existe en CATEGORÍAS .
Has creado una restricción de clave foránea (FK), que relaciona la tabla CATEGORÍAS con SUBCATEGORÍAS , siendo SUBCATEGORÍAS una tabla dependiente y CATEGORÍAS una tabla primaria.
El tema es que estás intentando ingresar un registro a SUBCATEGORÍAS sin haber ingresado todavía en la tabla CATEGORÍAS el valor de la clave de la que la SUBCATEGORÍAS depende.
Es como si quisieras hacer crecer las hojas de un árbol sin que creza la rama.

SIEMPRE tienes que ingresar primero los datos de las tablas primarias (son aquellas cuyos datos no dependen de ninguna otra tabla), antes de ingresarlos en las secundarias.
  #5 (permalink)  
Antiguo 08/03/2008, 01:15
 
Fecha de Ingreso: enero-2008
Mensajes: 68
Antigüedad: 16 años, 2 meses
Puntos: 1
Re: Ayuda esto es extraño.

creo que la clave foranea la declaraste mal

Código:
DROP TABLE IF EXISTS `subcategorias`;
CREATE TABLE `subcategorias` (
titulo varchar (64) NOT NULL,
titulo_categoria varchar (64) NOT NULL,
descripcion text NOT NULL,
PRIMARY KEY (`titulo`),
FOREIGN KEY (`titulo`) REFERENCES `categorias`(`titulo`) ON UPDATE CASCADE ON DELETE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;
por lo que veo, el campo que se debe relacionar es "titulo_categoria", y en el codigo tu estas relacionando el campo "titulo", lo que debes hacer es cambiar eso


Código:
DROP TABLE IF EXISTS `subcategorias`;
CREATE TABLE `subcategorias` (
titulo varchar (64) NOT NULL,
titulo_categoria varchar (64) NOT NULL,
descripcion text NOT NULL,
PRIMARY KEY (`titulo`),
FOREIGN KEY (`titulo_categoria`) REFERENCES `categorias`(`titulo`) ON UPDATE CASCADE ON DELETE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;
Ahi debería estar todo bien, y bueno, también debes tener en cuenta lo que te dice "gnzsoloyo" ya que es verdad eso, y el error es por lo que él te ha mencionado.
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 09:07.