<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 é capacitar o aluno a entrar no mercado de trabalho executando as atividades primordiais que são solicitadas no desenvolvimento, manutenção, ou atualização de bancos de dados dos mais diferentes tipos de sistemas.</p>
<p>Focamos na execução, e não em criação de diagramas - atividade essa que é 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 é gratuita e de fácil utilização - entretanto, todo o nosso conteúdo pode ser aplicado em qualquer Gerenciador de Bancos de Dados Relacionais, apenas com algumas mínimas diferenç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ão]: se você tentar atualizar o company_id na tabela COMPANY, o mecanismo rejeitará a operação se pelo menos um USUÁ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ê atualizar um company_id em uma linha da tabela COMPANY, o mecanismo irá atualizá-lo de acordo com todas as linhas USER que fazem referência a esta COMPANY;</li>
<li>ON UPDATE SET NULL [talvez a pior escolha]: se você atualizar um company_id em uma linha da tabela COMPANY, o mecanismo definirá 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ão]: se você tentar excluir um company_id na tabela COMPANY, o mecanismo irá rejeitar a operação se um USUÁRIO, ao menos, se vincular a esta empresa - essa opção pode salvar sua vida;</li>
<li>ON DELETE NO ACTION : mesmo que RESTRICT;</li>
<li>ON DELETE CASCADE [opção de alto risco]: se você excluir uma linha de empresa na tabela COMPANY, o mecanismo irá excluir também os USUÁRIOS relacionados;</li>
<li>ON DELETE SET NULL [útil em alguns casos]: se você excluir uma linha COMPANY, os USERs relacionados terão automaticamente a relação com NULL. Se Nulo for o seu valor para usuários sem empresa, este pode ser um bom comportamento, por exemplo, talvez você precise manter os usuários em seu aplicativo, como autores de algum conteúdo, mas remover a empresa não seria um problema para você.</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>

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