Problemas no MySQL

2 respostas
M

Galera, estou com um grande problema ao criar tabelas MySQL. Eis o código:

/* TABELA LOCAIS_PROD */
CREATE TABLE locais_prod (
	cod_local INT NOT NULL,
	nome_local VARCHAR(30) NOT NULL,
	PRIMARY KEY (cod_local)
);

/* TABELA TIPOS */
CREATE TABLE tipos (
	cod_tipo INT NOT NULL,
	nome_tipo VARCHAR(30) NOT NULL,
	PRIMARY KEY (cod_tipo)
);


/* TABELA CLASSES */
CREATE TABLE classes (
	cod_classe INT NOT NULL,
	nome_classe VARCHAR(30) NOT NULL,
	PRIMARY KEY (cod_classe)
);


/* TABELA UVAS */
CREATE TABLE uvas (
	cod_uva INT NOT NULL,
	nome_uva VARCHAR(30) NOT NULL,
	PRIMARY KEY (cod_uva)
);

/* TABELA TEOR */
CREATE TABLE teor (
	cod_teor INT NOT NULL,
	teor_acucar VARCHAR(30) NOT NULL,
	PRIMARY KEY (cod_teor)
);

/* ----------------------------- */


/* TABELA VINHOS */
CREATE TABLE vinhos (
	cod_vinho INT NOT NULL,
	nome_vinho VARCHAR(30) NOT NULL,
	cod_tipo INT NOT NULL,
	cod_teor INT NOT NULL,
	cod_uva INT NOT NULL,
	cod_classe INT NOT NULL,
	PRIMARY KEY (cod_vinho),
	FOREIGN KEY (cod_tipo) references tipos(cod_tipo),
	FOREIGN KEY (cod_teor) references teor(cod_teor),
	FOREIGN KEY (cod_uva)  references uvas(cod_uva),
	FOREIGN KEY (cod_classe) references classes(cod_classe)
); 


/* TABELA SAFRAS */
CREATE TABLE safras (
	cod_vinho INT NOT NULL,
	ano_safra INT NOT NULL,
	qtd_vinho INT NOT NULL,
	temp_media INT NOT NULL,
	tempo_ferm_vinho INT NOT NULL,
	PRIMARY KEY (cod_vinho, ano_safra),
	FOREIGN KEY (cod_vinho) references vinhos(cod_vinho)
);



/* TABELA RELACIONAL */
CREATE TABLE relac (
	cod_vinho INT NOT NULL,
	ano_safra INT NOT NULL,
	cod_local INT NOT NULL,
	PRIMARY KEY (cod_vinho, ano_safra, cod_local),
	FOREIGN KEY (cod_vinho) references vinhos(cod_vinho),
	FOREIGN KEY (ano_safra) references safras(ano_safra),
	FOREIGN KEY (cod_local) references locais_prod(cod_local)


);

PROBLEMA:

O MySQL dá o seguinte ERRO: "#1005 - Can't create table '.\bd\relac.frm' (errno: 150)"
Ele cria todas as tabelas menos a "relac", e já percebi que o erro está quando faço a seguinte relação:
"FOREIGN KEY (ano_safra) references safras(ano_safra)"

Qual será o problema? Já pesquisei e não achei nada similar a isto. Estou já desesperado pois tenho que terminar isto até este sábado.

Obrigado desde já.

2 Respostas

kaique

Cara, dei uma pesquisada e realmente é uma bronca estranha. Mas vamos para o que eu encontrei:

Muita gente que estava com esses problemas estavam usando o mysql 4.x. Caso isso não seja um requisito, eu tentaria mudar para a versão 5 para ver se o problema era resolvido. Isso caso você esteja usando a mesmva versão 4.x
Outra coisa que encontrei:

Não custa nada tentar ver se isso te ajuda a entender a bronca.
Outra dica foi tentar criar índices nas colunas onde serão criadas as FK`s.
Também achei esse depoimento:

Tenta seguir isso se as outras soluções não derem certo.
E por fim:
http://forums.mysql.com/read.php?22,19755,29094#msg-29094
Criaram essa thread só com esse problema. Talvez alguém dê uma dica boa.

Espero poder ter ajudado.
[]'s.

F

Pelo oq eu pude observar em testes utilizando o SQLyog,

Eu consegui criar a constraint de Foreign key para ano_safra depois que criei um indice separado para ano_safra na tabela safras...

A primeira vista parece que ele nao aceita um indice comum para uma chave primaria composta por duas colunas.

Bom .. nao sei se fiz besteira..mas gostaria que você testasse para validar..

Abaixo o código gerado pelo sqlyog

/*
SQLyog Community Edition- MySQL GUI v6.05
Host - 5.0.45-community-nt : Database - outroteste
*********************************************************************
Server version : 5.0.45-community-nt
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

create database if not exists `outroteste`;

USE `outroteste`;

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

/*Table structure for table `classes` */

DROP TABLE IF EXISTS `classes`;

CREATE TABLE `classes` (
  `cod_classe` int(11) NOT NULL,
  `nome_classe` varchar(30) NOT NULL,
  PRIMARY KEY  (`cod_classe`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/*Data for the table `classes` */

/*Table structure for table `locais_prod` */

DROP TABLE IF EXISTS `locais_prod`;

CREATE TABLE `locais_prod` (
  `cod_local` int(11) NOT NULL,
  `nome_local` varchar(30) NOT NULL,
  PRIMARY KEY  (`cod_local`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/*Data for the table `locais_prod` */

/*Table structure for table `relac` */

DROP TABLE IF EXISTS `relac`;

CREATE TABLE `relac` (
  `cod_vinho` int(11) NOT NULL,
  `ano_safra` int(11) NOT NULL,
  `cod_local` int(11) NOT NULL,
  PRIMARY KEY  (`cod_vinho`,`ano_safra`,`cod_local`),
  KEY `cod_local` (`cod_local`),
  KEY `FK_relac` (`ano_safra`),
  CONSTRAINT `FK_relac` FOREIGN KEY (`ano_safra`) REFERENCES `safras` (`ano_safra`),
  CONSTRAINT `relac_ibfk_1` FOREIGN KEY (`cod_vinho`) REFERENCES `vinhos` (`cod_vinho`),
  CONSTRAINT `relac_ibfk_2` FOREIGN KEY (`cod_local`) REFERENCES `locais_prod` (`cod_local`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/*Data for the table `relac` */

/*Table structure for table `safras` */

DROP TABLE IF EXISTS `safras`;

CREATE TABLE `safras` (
  `cod_vinho` int(11) NOT NULL,
  `ano_safra` int(11) NOT NULL,
  `qtd_vinho` int(11) NOT NULL,
  `temp_media` int(11) NOT NULL,
  `tempo_ferm_vinho` int(11) NOT NULL,
  PRIMARY KEY  (`cod_vinho`,`ano_safra`),
  UNIQUE KEY `ano_safra` (`ano_safra`),
  CONSTRAINT `safras_ibfk_1` FOREIGN KEY (`cod_vinho`) REFERENCES `vinhos` (`cod_vinho`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/*Data for the table `safras` */

/*Table structure for table `teor` */

DROP TABLE IF EXISTS `teor`;

CREATE TABLE `teor` (
  `cod_teor` int(11) NOT NULL,
  `teor_acucar` varchar(30) NOT NULL,
  PRIMARY KEY  (`cod_teor`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/*Data for the table `teor` */

/*Table structure for table `tipos` */

DROP TABLE IF EXISTS `tipos`;

CREATE TABLE `tipos` (
  `cod_tipo` int(11) NOT NULL,
  `nome_tipo` varchar(30) NOT NULL,
  PRIMARY KEY  (`cod_tipo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/*Data for the table `tipos` */

/*Table structure for table `uvas` */

DROP TABLE IF EXISTS `uvas`;

CREATE TABLE `uvas` (
  `cod_uva` int(11) NOT NULL,
  `nome_uva` varchar(30) NOT NULL,
  PRIMARY KEY  (`cod_uva`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/*Data for the table `uvas` */

/*Table structure for table `vinhos` */

DROP TABLE IF EXISTS `vinhos`;

CREATE TABLE `vinhos` (
  `cod_vinho` int(11) NOT NULL,
  `nome_vinho` varchar(30) NOT NULL,
  `cod_tipo` int(11) NOT NULL,
  `cod_teor` int(11) NOT NULL,
  `cod_uva` int(11) NOT NULL,
  `cod_classe` int(11) NOT NULL,
  PRIMARY KEY  (`cod_vinho`),
  KEY `cod_tipo` (`cod_tipo`),
  KEY `cod_teor` (`cod_teor`),
  KEY `cod_uva` (`cod_uva`),
  KEY `cod_classe` (`cod_classe`),
  CONSTRAINT `vinhos_ibfk_1` FOREIGN KEY (`cod_tipo`) REFERENCES `tipos` (`cod_tipo`),
  CONSTRAINT `vinhos_ibfk_2` FOREIGN KEY (`cod_teor`) REFERENCES `teor` (`cod_teor`),
  CONSTRAINT `vinhos_ibfk_3` FOREIGN KEY (`cod_uva`) REFERENCES `uvas` (`cod_uva`),
  CONSTRAINT `vinhos_ibfk_4` FOREIGN KEY (`cod_classe`) REFERENCES `classes` (`cod_classe`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/*Data for the table `vinhos` */

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
Criado 8 de dezembro de 2007
Ultima resposta 8 de dez. de 2007
Respostas 2
Participantes 3