Jump to content
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;

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By 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
    • By 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
       
       
    • By 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).
    • By Cleudiney T Brandão
      Pessoal saudações, preciso da ajuda de vocês tenho uma pagina a qual preciso exibir uma tabela em HTML contendo os Horarios, Pacientes ... que vem de uma table de meu banco mysql.
      Acontece que consigo formar a tabela, ajustar a data para a data atual, exibir linha a linha.
      Porém nos campos onde deveria aparecer o nome do paciente aparece o Numero de sua FK ( Chave estrangeira ), já tentei com inner join de diversas formas e não acerto, alguém me ajudaria?
      .
      As minhas tabelas as quais busco os dados são: " pacientes" e "agenda" o campo de pacientes é nome  e o de agenda é codigo_paciente o banco se chama gerenciador.
      Eu preciso que nas celulas onde está   " $info[codigo_paciente] " apareça o nome do paciente . Caso eu resolva com o nome os outros dados eu consigo fazer pois são da mesma tabela.
      O codigo é o seguinte:
       
      ml>
      <head>
      <?php
      include("conexao.php");
      date_default_timezone_set('America/Sao_Paulo');
      $date = date('Y-m-d');
      ?>
      <title>Clinica </title>
      </head>
      <body>
      <table>
      <H1 ALIGN="center"><FONT FACE="Arial" SIZE="10" COLOR="black">Clinica</FONT></H1>
      <H2 ALIGN="center"><FONT FACE="Arial" SIZE="5" COLOR="black">  Hoje - <?php date_default_timezone_set('America/Sao_Paulo'); $datee = date('d/m/Y H:i'); echo $datee;?> </FONT></H2>
       
      </table>
      <?php
      include("conexao.php");
      $query = "select * from agenda WHERE Data BETWEEN ('$date') AND ('$date');";
      $resultado = mysql_query($query,$conexao) or die(mysql_error());
      $idpac = isset($_GET["idpac"]) && ctype_digit($_GET['idpac']);

      if(mysql_num_rows($resultado)>0)
      {
            print "<table border='3' ALIGN='center'><FONT FACE='Arial' SIZE='10' COLOR='black'>";
            print "<tr colspan='10' rowspan='10'><td id='celula0'>Hora</td><td id='celula1'>Paciente</td><td id='celula2'>Presente?</td><td id='celula3'>P.Saude</td><td id='celula4'>Tel</td><td id='celula2'>Histórico</td></tr>";
                while ($info = mysql_fetch_array($resultado))
                    {
               print "<tr colspan='10' rowspan='10'><td id='celula0'>$info[hora]</td> <td id='celula1'>$info[codigo_paciente]</td><td id='celula2'>$info[faltou]</td><td id='celula3'>$info[codigo_paciente]</td><td id='celula4'>$info[codigo_paciente]</td><td id='celula4'>$info[codigo_paciente]</td></tr>";
             }
            print "</table>";
       }
      ?>
      </body>
      </html>
       
       
      dando certo 5 - apagar.php
    • By Cesar Melo
      Olá. Gostaria de criar uma view que exibisse os campos relacionados às chaves estrangeiras.
      Criei duas tabelas, uma chamada "PRODUTOS" e outra chamada "PRODUTO_COMPOSICAO".
      Na tabela "PRODUTOS" temos os campos ID e NOME.
      Na tabela "PRODUTO_COMPOSICAO" temos os campos: PRODUTO_FINAL_ID e COMPOSICAO_ID.
      Ambos campos da tabela PRODUTO_COMPOSICAO são chaves estrangeiras da tabela PRODUTO. As duas são PRODUTO.ID.
      Na pratica, um produto é composto por outros diversos produtos, então eu gostaria de criar uma view que me exibisse a seguinte informação:
      "Produto_Final_ID, Produto_Final_Nome, Composicao_id, Composicao_nome".
       
      Na simples view que eu criei, ou exibe o nome do produto final ou o nome da composição.
      VIEW vw_produto_composicao AS select produto_composicao.produto_final_id AS produto_final_id, produtos.nome AS produto_final_nome, produto_composicao.composicao_id AS composicao_id, produtos.nome AS composicao_nome, from (produto_composicao join produtos ON ((produto_composicao.composicao_id = produtos.id))) Ficou confusa a explicação ou é tranquilo pra entender?
       
      Obrigado!
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.