Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Carcleo

Chave estrangeira

Recommended Posts

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

É, 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

... 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

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
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

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 brinquedos

Quero calcular o percentual de não ótimos em relação ao total!

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

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
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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.