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

Relacines entre tablas;

Estas en el tema de Relacines entre tablas; en el foro de Mysql en Foros del Web. Intento crear una relacion entre la tabla vehiculos y la tabla de modelos de vehiculo. Primero inserto modelo de vehiculos y despues vehiculos que tiene ...
  #1 (permalink)  
Antiguo 11/05/2009, 16:06
 
Fecha de Ingreso: mayo-2009
Mensajes: 2
Antigüedad: 14 años, 11 meses
Puntos: 0
Relacines entre tablas;

Intento crear una relacion entre la tabla vehiculos y la tabla de modelos de vehiculo.
Primero inserto modelo de vehiculos y despues vehiculos que tiene una clave ajena a vehiculos.
Pero me salta el mysql con un error--> #1005 - Can't create table './proves/vehiculos.frm' (errno: 150)

¡¡¡ Alguien sabe porqué o le ha ocurrido algo similar!!!!!
GRACIAS

---------------------------------
TABLA MODELO_VEHICULOS
---------------------------------
CREATE TABLE modelo_vehiculos (
modelo varchar(50) UNIQUE NOT NULL,
idmodelo serial NOT NULL,
categoria varchar(25) NOT NULL,
unidades integer,
CONSTRAINT cp_modelo PRIMARY KEY( modelo )
) TYPE=InnoDB;

----------------------
TABLA VEHICULOS
---------------------
CREATE TABLE vehiculos (
matricula varchar(8) UNIQUE NOT NULL,
codveh serial NOT NULL,
modelo varchar(50) NOT NULL,
categoria varchar(25) NOT NULL,
costedia double NOT NULL,
numplazas integer,
numpuertas integer,
maletas integer,
radio boolean DEFAULT true,
aire boolean DEFAULT false,
descincidencias varchar(1000),
fecha timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
fechamod timestamp NULL,
reservado boolean DEFAULT false,
alquilado boolean DEFAULT false,
foto longblob NULL,
CONSTRAINT cp_codveh PRIMARY KEY( codveh ),
INDEX (modelo),
CONSTRAINT ca_modelo FOREIGN KEY ( modelo ) REFERENCES modelo_vehiculos (modelo) ON DELETE set null ON UPDATE cascade,
CONSTRAINT ri_matricula CHECK( LENGHT ( matricula )<=8 AND (matricula)>=7),
CONSTRAINT ri_numplazas CHECK( numplazas>0 AND numplazas<10 ),
CONSTRAINT ri_numpuertas CHECK( numpuertas>0 ),
CONSTRAINT ri_costedia CHECK( costedia>0),
CONSTRAINT ri_estado CHECK( categoria LIKE 'turismo' OR categoria LIKE 'furgoneta' OR categoria LIKE 'camion' OR categoria LIKE 'todoterreno')
) TYPE=InnoDB DEFAULT CHARACTER SET utf8;
  #2 (permalink)  
Antiguo 13/05/2009, 17:32
 
Fecha de Ingreso: mayo-2009
Mensajes: 14
Antigüedad: 14 años, 11 meses
Puntos: 1
Respuesta: Relacines entre tablas;

Hola esse1981

parece ser que rompe esta constrain

Código:
CONSTRAINT ca_modelo FOREIGN KEY ( modelo ) REFERENCES modelo_vehiculos (modelo) ON DELETE set null ON UPDATE cascade,
pero esta bien definida... mirando un poco la creacion de tus tablas en una le decis
Código:
 DEFAULT CHARACTER SET utf8;
pero en la otra no... ya me ha pasado que a veces me crean tablas sin consultar y para mayor sorpresa las constraint no me funcioaron si no tenian el mismo character set..

si fuera eso no tendria que haberte dejado hacer ni un solo insert..

Espero que te sirva Saludos..
  #3 (permalink)  
Antiguo 13/05/2009, 19:43
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
Respuesta: Relacines entre tablas;

Tienes al menos tres problemas básicos:
1. No puedes ponerle ON DELETE SET NULL, si el campos es NOT NULL. Es incongruente y no lo admitirá.
2. El CHARSET por default de la versión es LATIN1, si no se lo indicas los tipos de columna se vuelve incompatibles y genera un error. Este error estaba parcialmente salvado.
3. Estas usando una sintaxis obsoleta en la construcción de la tabla; por caso, la cláusula TYPE dejó de ser usada hace mucho, lo que va es ENGINE. Si bien el parser de MySQL se encarga de resolver la mayor parte del problema, es mejor ajustarse siempre al estandar.
La sintaxis para la versión 5.1 y posteriores sería:
Código sql:
Ver original
  1. DROP TABLE IF EXISTS `modelo_vehiculos`;
  2. CREATE TABLE  `modelo_vehiculos` (
  3.   `modelo` VARCHAR(50) NOT NULL,
  4.   `idmodelo` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  5.   `categoria` VARCHAR(25) CHARACTER SET latin1 NOT NULL,
  6.   `unidades` INT(11) DEFAULT NULL,
  7.   PRIMARY KEY  (`modelo`),
  8.   UNIQUE KEY `modelo` (`modelo`),
  9.   UNIQUE KEY `idmodelo` (`idmodelo`)
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  11.  
  12. DROP TABLE IF EXISTS `vehiculos`;
  13. CREATE TABLE  `vehiculos` (
  14.   `matricula` VARCHAR(8) NOT NULL,
  15.   `codveh` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  16.   `modelo` VARCHAR(50) NOT NULL,
  17.   `categoria` VARCHAR(25) NOT NULL,
  18.   `costedia` DOUBLE NOT NULL,
  19.   `numplazas` INT(11) DEFAULT NULL,
  20.   `numpuertas` INT(11) DEFAULT NULL,
  21.   `maletas` INT(11) DEFAULT NULL,
  22.   `radio` tinyint(1) DEFAULT '1',
  23.   `aire` tinyint(1) DEFAULT '0',
  24.   `descincidencias` VARCHAR(1000) DEFAULT NULL,
  25.   `fecha` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  26.   `fechamod` TIMESTAMP NULL DEFAULT NULL,
  27.   `reservado` tinyint(1) DEFAULT '0',
  28.   `alquilado` tinyint(1) DEFAULT '0',
  29.   `foto` longblob,
  30.   PRIMARY KEY  (`codveh`),
  31.   UNIQUE KEY `matricula` (`matricula`),
  32.   UNIQUE KEY `codveh` (`codveh`),
  33.   KEY `ca_modelo` (`modelo`),
  34.   CONSTRAINT `ca_modelo` FOREIGN KEY (`modelo`) REFERENCES `modelo_vehiculos` (`modelo`) ON UPDATE CASCADE
  35. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 14/05/2009, 02:54
 
Fecha de Ingreso: mayo-2009
Mensajes: 2
Antigüedad: 14 años, 11 meses
Puntos: 0
Respuesta: Relacines entre tablas;

Si, gracias, correcto. Es la codificación. Si se usa el InnoDB de mysql, arroja un error mas claro donde ya te especifica que es la codficacion de cada tabla. una estava en myisam i la otra en utf-8.

Saludos.
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 21:08.