Carcleo 4 Denunciar post Postado Abril 14, 2014 Olé pessoal, Tenho a seguinte SQL para criar tabelas mas quando chega na geração das chaves estrangeiras dá erro. create table if not exists doadores ( id int(5) unsigned not null auto_increment, cpf char(11), nome varchar(255) not null, endereco varchar(255) not null, telefone varchar(11), /*possibilidade de telefones de 1 dígito à mais como é o caso atual de São Paulo*/ identificarDoador enum('sim','não') not null, primary key (id) ); create table if not exists brinquedos ( id int(5) unsigned not null auto_increment, nomeModelo varchar(255) not null, descricao text, idadeMin int(2), idadeMax int(2), doador int(5), sexo enum('Masculino', 'Feminino'), estadoConservacao enum('Ruim', 'Bom', 'Ótimo', 'Novo') not null, doado char(1), primary key (id) /*foreign key (doador) references doadores(id)*/ ); create table if not exists criancas ( id int(5) unsigned not null auto_increment, nome varchar(255) not null, sexo enum('Masculino', 'Feminino'), cpfResponsavel char(11), nomeResponsavel varchar(255) not null, enderecoResponsavel varchar(255) not null, telefoneResponsavel varchar(11), atendida char(1), primary key (id) ); create table if not exists organizadores ( id int(5) unsigned not null auto_increment, nome varchar(255) not null, cpf char(11) not null, login varchar (10) not null, senha varchar (10) not null, primary key (id) ); create table if not exists doacoes ( id int(5) unsigned not null auto_increment, crianca int(5) not null, brinquedo int(5) not null, organizador int(5) not null, dataHora datetime not null, primary key (id) /* foreign key (crianca) references criancas(id), foreign key (brinquedo) references brinquedos(id), foreign key (organizador) references organizadores(id), foreign key (doador) references doadores(id) */ ); ALTER TABLE brinquedos ADD CONSTRAINT brinquedos_ibfk_1 FOREIGN KEY (doador) REFERENCES doadores (id); ALTER TABLE doacoes ADD CONSTRAINT doacoes_ibfk_1 FOREIGN KEY (crianca) REFERENCES criancas (id); ALTER TABLE doacoes ADD CONSTRAINT doacoes_ibfk_2 FOREIGN KEY (brinquedo) REFERENCES brinquedos (id); ALTER TABLE doacoes ADD CONSTRAINT doacoes_ibfk_3 FOREIGN KEY (organizador) REFERENCES organizadores (id); Observação: da forma que esta nas linhas comentadas também dá erro; Erro Comando SQL: ALTER TABLE brinquedos ADD CONSTRAINT brinquedos_ibfk_1 FOREIGN KEY ( doador ) REFERENCES doadores( id ) ; Mensagens do MySQL : Documentação #1005 - Can't create table 'doacoes.#sql-728_23' (errno: 150) (Details…) Detalhe: InnoDB Documentação Supports transactions, row-level locking, and foreign keys Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Abril 14, 2014 O código do erro em geral ajuda. veja se este blog te ajuda. Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Abril 14, 2014 É, olhei detalhe por detalhe e não encontrei nada que obstruísse a criação da chave estrangeira! create table if not exists doadores ( id int(5) not null auto_increment, cpf char(11), nome varchar(255) not null, endereco varchar(255) not null, telefone varchar(11), identificarDoador enum('sim','não') not null, primary key (id) ); create table if not exists brinquedos ( id int(5) not null auto_increment, nomeModelo varchar(255) not null, descricao text, idadeMin int(2), idadeMax int(2), doador int(5) not null, sexo enum('Masculino', 'Feminino'), estadoConservacao enum('Ruim', 'Bom', 'Ótimo', 'Novo') not null, doado char(1), primary key (id), foreign key (doador) references doadores(id) ); create table if not exists criancas ( id int(5) not null auto_increment, nome varchar(255) not null, sexo enum('Masculino', 'Feminino'), cpfResponsavel char(11), nomeResponsavel varchar(255) not null, enderecoResponsavel varchar(255) not null, telefoneResponsavel varchar(11), atendida char(1), primary key (id) ); create table if not exists organizadores ( id int(5) not null auto_increment, nome varchar(255) not null, cpf char(11) not null, login varchar (10) not null, senha varchar (10) not null, primary key (id) ); create table if not exists doacoes ( id int(5) not null auto_increment, crianca int(5) not null, brinquedo int(5) not null, organizador int(5) not null, dataHora datetime not null, primary key (id), foreign key (crianca) references criancas(id), foreign key (brinquedo) references brinquedos(id), foreign key (organizador) references organizadores(id) ); De fato tinha uma falha. as ids são unsigned. Mas nas fk's eu não havia colocado unsigned. Obrigado pela dica. create table if not exists doadores ( id int(5) unsigned not null auto_increment, cpf char(11), nome varchar(255) not null, endereco varchar(255) not null, telefone varchar(11), /*possibilidade de telefones de 1 dígito à mais como é o caso atual de São Paulo*/ identificarDoador enum('sim','não') not null, primary key (id) ); create table if not exists brinquedos ( id int(5) unsigned not null auto_increment, nomeModelo varchar(255) not null, descricao text, idadeMin int(2), idadeMax int(2), doador int(5) unsigned, sexo enum('Masculino', 'Feminino'), estadoConservacao enum('Ruim', 'Bom', 'Ótimo', 'Novo') not null, doado char(1), primary key (id), foreign key (doador) references doadores(id) ); create table if not exists criancas ( id int(5) unsigned not null auto_increment, nome varchar(255) not null, sexo enum('Masculino', 'Feminino'), cpfResponsavel char(11), nomeResponsavel varchar(255) not null, enderecoResponsavel varchar(255) not null, telefoneResponsavel varchar(11), atendida char(1), primary key (id) ); create table if not exists organizadores ( id int(5) unsigned not null auto_increment, nome varchar(255) not null, cpf char(11) not null, login varchar (10) not null, senha varchar (10) not null, primary key (id) ); create table if not exists doacoes ( id int(5) unsigned not null auto_increment, crianca int(5) unsigned not null, brinquedo int(5) unsigned not null, organizador int(5) unsigned not null, dataHora datetime not null, primary key (id), foreign key (crianca) references criancas(id), foreign key (brinquedo) references brinquedos(id), foreign key (organizador) references organizadores(id) ); Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Abril 14, 2014 ... pode ter mais ... doado char(1), primary key (id), foreign key (doador) references doadores(id) ); Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Abril 14, 2014 doador é diferente de doado. Existem os dois campos. aproveitando, o que há de errado nessa consuta? ( SELECT count(id) FROM brinquedos WHERE estadoConservacao <> "novo" ) DIV ( SELECT count(id) FROM brinquedos ); Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Abril 14, 2014 doador é diferente de doado. Existem os dois campos Ok Não conheço esta síntaxe DIV , não seria NOT EXISTS !? Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Abril 14, 2014 A ideia é pegar um filtro e dividir pelo total e encontrar a porcentagem. Alterei o código lá! Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Abril 14, 2014 Tentou ir criando as tabelas uma a uma ?! Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Abril 14, 2014 Como assim? Não entendi! Criar as tabelas uma a uma? Isso é uma consulta! Tenho uma quantidade brinquedos que não são ótimos.Tenho a quantidade total de brinquedosQuero calcular o percentual de não ótimos em relação ao total! Compartilhar este post Link para o post Compartilhar em outros sites
lokaodomau 61 Denunciar post Postado Abril 14, 2014 Verifique se todas as tabelas são engine = InnoDB Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Abril 14, 2014 Consegui da forma abaixo, falta a conversão de tipos para float e deixar apenas duas casas decimais. SELECT (COUNT( id ) / (SELECT COUNT( id ) FROM brinquedos )) * 100 FROM brinquedos WHERE estadoConservacao <> "novo" são inno db Compartilhar este post Link para o post Compartilhar em outros sites
lokaodomau 61 Denunciar post Postado Abril 14, 2014 As chaves estrangeiras ainda não funcionam? Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Abril 14, 2014 já esta tudo funcionando já agora o problema é apenas pegar o resultado da consulta com duas casas decimais: SELECT (COUNT( id ) / (SELECT COUNT( id ) FROM brinquedos )) * 100 FROM brinquedos WHERE estadoConservacao <> "novo" Compartilhar este post Link para o post Compartilhar em outros sites
lokaodomau 61 Denunciar post Postado Abril 14, 2014 Tenta assim: SELECT ROUND( COUNT(IF (estadoConservacao != 'novo', 'qualquer valor nao nulo', NULL)) / COUNT(id)* 100, # calculo 2 # casas decimais )AS percentual FROM brinquedos Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Abril 14, 2014 Criar as tabelas uma a uma? Isso é uma consulta! Sua dúvida original era o erro no CREATE table, pelo visto resolvido. Quanto ao "div" parece resolvido no #14 Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Abril 14, 2014 Sim, obrigado! Era isso aqui: SELECT TRUNCATE((SELECT (COUNT(id) / (SELECT COUNT(id) FROM brinquedos)) FROM brinquedos WHERE estadoConservacao <> "novo"), 2); Compartilhar este post Link para o post Compartilhar em outros sites