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