Ir para conteúdo
Hamilcar

Modelagem de tabela com chave estrangeira

Recommended Posts

Bom dia a todos!

Estou tentando fazer uma base de dados onde tenho 3 tabelas, usuario, requerimento e escala. Onde um usuario faz um requerimento e deste requerimento geraria uma escala.

Gostaria de preparar a base de dados para que quando cadastrar um requerimento, esse requerimento só seja incluído se houver um usuario ligado a este requerimento, e quando cadastrar uma escala, esta seja ligada ao requerimento que a gerou, e quando for editar ou excluir, não exclua um requerimento sem excluir a escala.

Tentei aqui um modelo com chave estrangeira, mas quando incluo um requerimento que não esteja vinculado a um usuario, dá um "warning" e inclue assim mesmo, e para excluir também faz da mesma forma. abaixo as tabelas.

 

CREATE TABLE `usuario` (
  `nome_usuario` varchar(100) DEFAULT NULL,
  `id_usuario` int(11) NOT NULL,
  `telefone_usuario` varchar(20) DEFAULT NULL,
  `data_cadastro_usuario` datetime DEFAULT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

 

CREATE TABLE `requerimento` (
  `id_requerimento` int(11) NOT NULL,
  `data_requerimento` datetime NOT NULL,
  `status_requerimento` enum('0','1') NOT NULL DEFAULT '0',
  `id_usuario` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

 

CREATE TABLE `escala` (
  `id_escala` int(11) NOT NULL,
  `local_escala` varchar(100) NOT NULL,
  `horário_escala` varchar(100) NOT NULL,
  `data_escala` date NOT NULL,
  `id_requerimento` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

 

--
-- Índices para tabela `escala`
--
ALTER TABLE `escala`
  ADD PRIMARY KEY (`id_escala`),
  ADD KEY `fk_requerimento_escala` (`id_requerimento`);

--
-- Índices para tabela `requerimento`
--
ALTER TABLE `requerimento`
  ADD PRIMARY KEY (`id_requerimento`),
  ADD KEY `fk_usuario_requerimento` (`id_usuario`);

--
-- Índices para tabela `usuarios`
--
ALTER TABLE `usuario`
  ADD PRIMARY KEY (`id_usuario`);
COMMIT;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue exemplo, abaixo:

 

SQL:

CREATE TABLE usuario (
	id_usuario INT NOT NULL AUTO_INCREMENT,
	nome_usuario VARCHAR(100) NOT NULL, # "NOT NULL" = CAMPO OBRIGATÓRIO
	telefone_usuario VARCHAR(20) DEFAULT NULL,
	data_cadastro_usuario DATETIME NOT NULL, # "NOT NULL" = CAMPO OBRIGATÓRIO
	PRIMARY KEY (id_usuario)
);

CREATE TABLE requerimento (
	id_requerimento INT NOT NULL AUTO_INCREMENT,
	data_requerimento DATETIME NOT NULL,
	status_requerimento ENUM('0','1') NOT NULL DEFAULT '0',
	id_usuario INT NOT NULL,
	PRIMARY KEY (id_requerimento),
	FOREIGN KEY (id_usuario) REFERENCES usuario (id_usuario)
);

CREATE TABLE escala (
	id_escala INT NOT NULL AUTO_INCREMENT,
	local_escala VARCHAR(100) NOT NULL,
	horario_escala VARCHAR(100) NOT NULL,
	data_escala DATE NOT NULL,
	id_requerimento INT NOT NULL,
	PRIMARY KEY (id_escala),
	FOREIGN KEY (id_requerimento) REFERENCES requerimento (id_requerimento)
);

SCHEMA:

image.png.0f449641ce591534043c25be22b0feba.png

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 28/01/2020 at 14:37, ShadowDLL disse:

Segue exemplo, abaixo:

 

SQL:


CREATE TABLE usuario (
	id_usuario INT NOT NULL AUTO_INCREMENT,
	nome_usuario VARCHAR(100) NOT NULL, # "NOT NULL" = CAMPO OBRIGATÓRIO
	telefone_usuario VARCHAR(20) DEFAULT NULL,
	data_cadastro_usuario DATETIME NOT NULL, # "NOT NULL" = CAMPO OBRIGATÓRIO
	PRIMARY KEY (id_usuario)
);

CREATE TABLE requerimento (
	id_requerimento INT NOT NULL AUTO_INCREMENT,
	data_requerimento DATETIME NOT NULL,
	status_requerimento ENUM('0','1') NOT NULL DEFAULT '0',
	id_usuario INT NOT NULL,
	PRIMARY KEY (id_requerimento),
	FOREIGN KEY (id_usuario) REFERENCES usuario (id_usuario)
);

CREATE TABLE escala (
	id_escala INT NOT NULL AUTO_INCREMENT,
	local_escala VARCHAR(100) NOT NULL,
	horario_escala VARCHAR(100) NOT NULL,
	data_escala DATE NOT NULL,
	id_requerimento INT NOT NULL,
	PRIMARY KEY (id_escala),
	FOREIGN KEY (id_requerimento) REFERENCES requerimento (id_requerimento)
);

SCHEMA:

image.png.0f449641ce591534043c25be22b0feba.png

 

 

Obrigado, agora funcionou direitinho

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por andreygsantos
      Pessoal, normalmente faço modelagem de banco de dados usando o CA ErWin, mas precisei utilizar a ferramenta de modelagem do MySQL Workbench 8.0 Community.
      O problema ocorre quando a ferramenta começa a "enfeitar o pavão" quando se trata de FK. Vou mostrar um exemplo básico:

      Temos aqui 3 tabelas representando condomínio, unidades e vagas. As vagas pertencem ao condomínio, assim como as unidades. As vagas podem pertencer a unidades diferentes no decorrer do tempo porque não são vagas fixas, portanto não posso pendurar vaga na unidade.
      Problema 1: FK recebe o nome da tabela origem automaticamente.
      Até aqui posso renomear o atributo ou alterar as configurações de modelagem.
       

      Atributos renomeados, temos o seguinte modelo representado acima. Agora vamos levar a PK da entidade UNIDADE para ser FK não identificação na entidade VAGA.
       

      E agora temos o Problema 2: a ferramenta não entende que o atributo CondomínioID já existe e cria novamente com o prefixo da entidade origem. Parece um problema besta e fácil de resolver apagando o atributo duplicado e mantendo apenas UnidadeID, mas ao sincronizar com o banco de dados, começam a surgir erros com índices.
      Abaixo mostro como fica a modelagem no ERWin sem qualquer interferência:
       

      Como podem ver, a modelagem fica perfeita. O ErWin entende que o atributo já existe na entidade e leva apenas o atributo que vai diferenciar para fazer o relacionamento.
       
      Vocês devem estar se perguntando por que eu não uso o ErWin então... Mas a versão do ErWin que tenho não suporta MySQL após a versão 5.x e uma licença nova dessa ferramenta vai me custar 1 rim, senão os 2... Teoricamente, o Workbench deveria fazer essa modelagem sem problemas, mas eu não conheço bem e talvez possa ser alguma configuração. Alguém teria uma luz?
      Obrigado.
       
    • Por phfmiranda
      Bom dia,
       
      Tenho um BD com 3 tabelas
       
      tb_cliente - Chave primaria id_cliente
      tb_dados - chave estrangeira id_cliente
      tb_crediario - chave estrangeira id_cliente
       
      O que acontece é que como já temos dados nas mesmas não estou conseguindo criar a chave estrangeira abaixo, tem alguma ideia de como criar a mesma sem alterar os dados??
       
      ALTER TABLE `tb_dados` ADD FOREIGN KEY (`id_cliente`) REFERENCES `tb_cliente`(`id_cliente`) ON DELETE CASCADE  
      Obrigado.
    • Por tupinikin
      Bom dia senhores.
      Estou dando manutenção em uma banco de dados que não estava normalizado, sem chaves estrangeiras etc etc
      depois de cria-las, quando vou importar os dados, acontecem vários erros, pq tem chaves primárias que foram excluidas
      e no caso da estrangeira, fica ausente.
      No phpmyadmin tem a opção de não checar as chaves, mas não gostaria de manter dados que não existem.
       
      Qual a forma mais fácil de eu encontrar os registros que estão referenciados á um chave primária que não existe?
       
      grato
    • Por Marcosvn
      Bom dia turma !
       
      já procurei na internet e até encontrei muito artigo relacionado, mas ainda estou com muito dificuldade para exibir os dados da tabela principal (usuario) com a tabela (empresas - estrangeira)
       
      o usuário do site, ao se cadastrar, vai inserir seus dados e a empresa em que trabalha. Em seguida, a página referente aquela empresa (ex: atento.php) deve exibir todos os usuários daquela empresa entenderam ?
       
       -  o nome do Banco de Dados "TrocaEmpresas"
      a tabela é essa: 

       
      supondo que na tabela empresas esteja assim: 
      id: 1
      Nome: Atento
       
      Considerando que preciso exibir apenas o "nome ", "sobrenome" , "email" e "Empresa", como faço para exibir todos os usuários cadastrados nessa empresa na página atento.php ?
       
      encontrei muita coisa sobre INNER JOIN, mas não consigo de jeito nenhum fazer funcionar, eu não estou entendendo muito bem o funcionamento, agradeço a disposição dos que me ajudarem a esclarecer essa dificuldade.
       
      um abraço, vlw
       
       
    • Por yasmincris
      Bom dia a todos, então estou com uma duvida em banco de dados MySQL, como faria um insert nessas duas tabelas?
      CREATE TABLE IF NOT EXISTS `cria`.`usuario` ( `iduser` INT(10) NOT NULL AUTO_INCREMENT, `nomeuser` VARCHAR(50) NOT NULL, `telefoneuser` BIGINT(20) NOT NULL, `celularuser` BIGINT(20) NOT NULL, `emailuser` VARCHAR(45) NOT NULL, `senhauser` VARCHAR(50) NOT NULL, `img_user` VARCHAR(300) NOT NULL, PRIMARY KEY (`iduser`), UNIQUE INDEX `emailuser` (`emailuser` ASC), INDEX `fk_usuario_animal1_idx` (`iduser` ASC), CONSTRAINT `fk_usuario_animal1` FOREIGN KEY (`iduser`) REFERENCES `cria`.`animal` (`idanimal`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB AUTO_INCREMENT = 2 DEFAULT CHARACTER SET = latin1; CREATE TABLE IF NOT EXISTS `cria`.`animal` ( `idanimal` INT(10) NOT NULL AUTO_INCREMENT, `nomeanimal` VARCHAR(30) NOT NULL, `raca` VARCHAR(20) NOT NULL, `vacinas` VARCHAR(20) NOT NULL, `animal_img` VARCHAR(300) NOT NULL, PRIMARY KEY (`idanimal`)) ENGINE = InnoDB AUTO_INCREMENT = 2 DEFAULT CHARACTER SET = latin1; Então eu sei que tenho que fazer select join, mas não sei se como colocar o 'value' nisso:
      insert into usuario ( nomeuser, telefoneuser, celularuser, emailuser, senhauser, img_user ) ( SELECT nomeuser, telefoneuser, celularuser, emailuser, senhauser, img_user FROM usuario JOIN animal ON usuario.iduser = animal.idanimal ) ; aonde eu colocaria os valores? Lembrando que depois colocarei em php os comandos(mesmo que não faça diferença rs).
×

Informação importante

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