---
# System prepended metadata

title: "\n BD Essencial - Aula 10\n"

---

<p><img src="https://i.imgur.com/D01Fpky.png" alt="" title="Entre no nosso site e veja nossos cursos"></p>
<h1>
<img class="emoji" alt="" src="https://image.flaticon.com/icons/png/128/2906/2906274.png"> BD Essencial - Aula 10
</h1>

<p>O objetivo desse curso &eacute; capacitar o aluno a entrar no mercado de trabalho executando as atividades primordiais que s&atilde;o solicitadas no desenvolvimento, manuten&ccedil;&atilde;o, ou atualiza&ccedil;&atilde;o de bancos de dados dos mais diferentes tipos de sistemas.</p>
<p>Focamos na execu&ccedil;&atilde;o, e n&atilde;o em cria&ccedil;&atilde;o de diagramas - atividade essa que &eacute; desenvolvida por profissionais mais experientes.</p>
<p>Nas nossas prieiras aulas, utilizamos o Gerenciador de Bancos de Dados Relacionais <strong>MySQL</strong> nesse nosso curso de Banco de Dados Essencial, porque essa ferramenta &eacute; gratuita e de f&aacute;cil utiliza&ccedil;&atilde;o - entretanto, todo o nosso conte&uacute;do pode ser aplicado em qualquer Gerenciador de Bancos de Dados Relacionais, apenas com algumas m&iacute;nimas diferen&ccedil;as.</p>
<p>Na segunda parte do curso, utilizamos o Gerenciador de Bancos de Dados Relacionais <strong>PostgreSQL</strong>.</p>

<blockquote style="border-left-color: red;">
<p><span class="color" data-color="red"></span><span> </span><small><i class="fa fa-user"></i> Prof Fernando Gomes - fernandojnr@gmail.com</small></p></blockquote>


<h2 id="-Tema-da-aula" data-id="-Tema-da-aula"><a class="anchor hidden-xs" href="#-Tema-da-aula" title="-Tema-da-aula"><span class="octicon octicon-link"></span></a><img class="emoji" alt=":book:" src="https://cdn.jsdelivr.net/npm/@hackmd/emojify.js@2.1.0/dist/images/basic/book.png">
<span> Tema da aula:</span></h2><span>
<p>Nessa décima aula, mostramos uma stored procedure que grava em duas tabelas, utilizando <strong>last_insert_id()</strong>. Em seguida, criamos uma consulta na tabela da aula 9 e utilizamos essa consulta no <strong>iReport 5.6</strong>.</p>

<h3>Regras para chaves estrangeiras</h3>
<p><strong>ON UPDATE</strong></p>
<ul>
<li>ON UPDATE RESTRICT [padr&atilde;o]: se voc&ecirc; tentar atualizar o company_id na tabela COMPANY, o mecanismo rejeitar&aacute; a opera&ccedil;&atilde;o se pelo menos um USU&Aacute;RIO se conectar a esta empresa;</li>
<li>ON UPDATE NO ACTION : mesmo que RESTRICT;</li>
<li>ON UPDATE CASCADE [considerada a melhor escolha]: se voc&ecirc; atualizar um company_id em uma linha da tabela COMPANY, o mecanismo ir&aacute; atualiz&aacute;-lo de acordo com todas as linhas USER que fazem refer&ecirc;ncia a esta COMPANY;</li>
<li>ON UPDATE SET NULL [talvez a pior escolha]: se voc&ecirc; atualizar um company_id em uma linha da tabela COMPANY, o mecanismo definir&aacute; company_id para todos os relacionados a essa COMPANY como NULL.</li>
</ul>
<p><strong>ON DELETE</strong></p>
<ul>
<li>ON DELETE RESTRICT [padr&atilde;o]: se voc&ecirc; tentar excluir um company_id na tabela COMPANY, o mecanismo ir&aacute; rejeitar a opera&ccedil;&atilde;o se um USU&Aacute;RIO, ao menos, se vincular a esta empresa - essa op&ccedil;&atilde;o pode salvar sua vida;</li>
<li>ON DELETE NO ACTION : mesmo que RESTRICT;</li>
<li>ON DELETE CASCADE [op&ccedil;&atilde;o de alto risco]: se voc&ecirc; excluir uma linha de empresa na tabela COMPANY, o mecanismo ir&aacute; excluir tamb&eacute;m os USU&Aacute;RIOS relacionados;</li>
<li>ON DELETE SET NULL [&uacute;til em alguns casos]: se voc&ecirc; excluir uma linha COMPANY, os USERs relacionados ter&atilde;o automaticamente a rela&ccedil;&atilde;o com NULL. Se Nulo for o seu valor para usu&aacute;rios sem empresa, este pode ser um bom comportamento, por exemplo, talvez voc&ecirc; precise manter os usu&aacute;rios em seu aplicativo, como autores de algum conte&uacute;do, mas remover a empresa n&atilde;o seria um problema para voc&ecirc;.</li></ul>
<p>Uma boa escolha seria: ON DELETE RESTRICT ON UPDATE CASCADE.</p>



```sql=
drop database if exists banco7;
create database banco7;
use banco7;

create table usuario
(id int primary key auto_increment,
 nome varchar (50), 
 email varchar (50) not null unique,
 senha varchar (255));

create table endereco
(idEndereco int primary key auto_increment,
 cep varchar (20), logradouro varchar (80),
 bairro varchar (50), cidade varchar (50),
 estado varchar (20),
 idUsuario int,
 foreign key(idUsuario) references 
 usuario(id) on delete cascade);
-- podemos apagar todos os endereços de um
-- usuário, caso seja necessário excluir
-- esse usuário, porque, nesse exemplo,
-- duas pessoas no mesmo endereço, levaria 
-- a cada uma delas cadastrar seu endereço


-- stored procedure que grava em duas tabelas
-- grava o usuário, e pega seu id
-- para usar na gravação de endereço
drop procedure if exists gravar_usr_end; 
delimiter $$
 create procedure gravar_usr_end(
     vnome varchar(50), 
     vemail varchar(50),
     vsenha varchar(255), 
     vcep varchar(20), 
     vlogradouro varchar(80),
     vbairro varchar(50),
     vcidade varchar(50),
     vestado varchar(20))
begin
    declare vsenha2 varchar(255);
    set vsenha2 = 
    MD5(CONCAT(vsenha, "Use e$$e text0 p@ra aprimor@r o MD5!!!"));
 insert into usuario values (null,
   vnome, 
   vemail,
   vsenha2);
 insert into endereco values (null, 
   vcep, 
   vlogradouro,
   vbairro, 
   vcidade,
   vestado, 
   last_insert_id());
end;
$$
delimiter ;


call gravar_usr_end('fernando','fernando@gmail.com',
'123', '20040007','Av. Rio branco,185', 
'centro','rio de janeiro','rj');


call gravar_usr_end('belem','belem@gmail.com',
'456', '20140037','Av. XYZ,300', 
'barra','rio de janeiro','rj');

select * from usuario;
select * from endereco;



```

<h5>
Consulta para usar no <strong>iReport</strong>:
</h5>

```sql=
-- BD da aula 4
use banco5;

select f.nome nome, f.sexo sexo, p.nome projeto, p.datainicio 
from funcionario f INNER JOIN FuncionarioAlocado fa
ON f.idFuncionario = fa.id_func INNER JOIN projeto p
ON fa.id_proj = p.idProjeto
ORDER BY nome;

+----------+------+-----------+------------+
| nome     | sexo | projeto   | datainicio |
+----------+------+-----------+------------+
| fabio    | m    | academico | 2015-01-15 |
| globinho | m    | ecommerce | 2016-03-15 |
| lu       | f    | ecommerce | 2016-03-15 |
| lu       | f    | academico | 2015-01-15 |
| marcel   | m    | academico | 2015-01-15 |
+----------+------+-----------+------------+
5 rows in set (0.122 sec)




```

<!--
<h3>
Tipos de Dados Numéricos do MySQL
</h3>

<p>
Na tabela abaixo vemos os tipos da dados numéricos aceitos no MySQL. Utilizamos, BIT ou TINYINT(1) para armazenar um campo booleano. Além dessa situação, os mais utilizados são TINYINT, INT, e DOUBLE. Por padrão, os campos admitem números com sinal, portanto, o padrão [default] é SIGNED.
</p>

![](https://i.imgur.com/ctbQVW0.png)
-->

<blockquote style="border-left-color: red;">
<p><span class="color" data-color="red"></span><span> </span><small><i class="fa fa-user"></i> Prof Fernando Gomes - fernandojnr@gmail.com</small></p></blockquote>

<br>
<div class="alert alert-info">
<blockquote style="border-left-color: blue;">
<p><span class="color" data-color="blue"></span><span> </span><small><i class="fa fa-user"></i> E.B. Cursos https://www.cursoseb.com.br/</small><br>
<span class="color" data-color="blue"></span><span> </span><small><i class="fa fa-user"></i> E.B. Cursos EAD https://edsonbelemtreinamento.com.br/ead/</small></p>
</blockquote>
</div>




