Os comandos ON UPDATE CASCADE e ON DELETE CASCADE servem para que, no momento que eu for utilizar meus comandos UPDATE ou DELETE para modificar os campos ou registros da minha tabela, todos as PK e FK sejam modificadas, também.
- Pedido
- Cliente
Observe a tabela VENDEDOR. Suponhamos que preciso inserir mais quatro campos: e-mail, endereço, cidade e CEP. Eu não preciso excluir minha tabela VENDEDOR e criá-la novamente. O SQL oferece um comando onde posso alterar essa tabela: alter table.
Entro com o comando ALTER TABLE e o nome da tabela que será alterada, a cláusula ADD (adicionar) e o nome do novo campo e o tipo do dado.
Depois de inseridos meus novos campos, veja como ficou a tabela:
02 | add email varchar (20); |
05 | add endereco varchar (40); |
08 | add cidade varchar (15); |
Observação: os novos campos adicionados são nulos porque não foi adicionado nenhum registro.
Observe, agora, a tabela CLIENTE. Para excluir registros de alguma tabela especificada, podemos utilizar o comando DELETE junto com a cláusula WHERE. Se a cláusula WHERE estiver ausente, todos os registros da tabela especificada serão excluídos. Resultado: tabela válida, mas vazia.
Suponhamos que eu queira remover o cliente chamado Estrutura Construtora da minha tabela CLIENTE, que é a tabela onde são inseridos os meus clientes. Então, entramos com o comando DELETE e a tabela especificada, juntamente com a cláusula WHERE e o campo da tabela que será declarado o registro que será excluído.
Lembrem-se: a cláusula WHERE é uma condição. Se não utilizá-la para especificar o registro que será excluído, todos os campos da tabela CLIENTE serão apagados.
1 | delete from cliente where codigo_cliente = 4; |
Observação: se no momento em que foram criados os relacionamentos de foreign keys da minha base de dados eu não tiver usado o ON UPDATE CASCADE, teríamos o seguinte erro:
Este erro que diz que o comando DELETE conflitou com a constraint fk_pedido_cliente criada para referenciar uma chave estrangeira entre a tabela PEDIDO e CLIENTE e, ainda especifica o nome da base de dados onde ocorre o erro, o nome da tabela e seu campo.
Esse erro aconteceu porque a tabela PEDIDO (CODIGO_CLIENTE) referencia CLIENTE (CODIGO_CLIENTE), ou seja, uma foreign key. Conclusão: utilize ON UPDATE CASCADE nos seus relacionamentos.
Ainda na tabela CLIENTE, vamos alterar o campo tipo_industria. Todos as linhas que tem tipo_industria como B deverão ser trocados para C. Como fazer isso? Temos um comando chamado UPDATE que muda os valores dos campos especificados em todas as linhas que satisfazem a condição. Podemos utilizá-lo com a cláusula SET, onde são especificadas as colunas que serão modificadas. As demais permanecem com seus valores atuais.
1 | update cliente set tipo_industria=’C’ where tipo_industria=’B’; |
Dando um novo select na tabela CLIENTE, veja como ela ficou depois de excluirmos um cliente e fazendo os updates do tipo_industria:
Agora observe a tabela VENDEDOR. Vamos mudar o nome do vendedor Abel para Abel Medeiros. Para isso, utilizamos o comando UPDATE.
1 | update vendedor set nome=’Abel Medeiros’ where nome=’Abel’; |
3 | update vendedor set codigo_vendedor=777 where codigo_vendedor=111; |
Veja como ficou nossa tabela VENDEDOR depois que fizemos os updates para o nome Abel Medeiros e trocamos seu codigo_vendedor de 111 para 777.
Note também que, na tabela CLIENTE onde tenho um relacionamento com a tabela VENDEDOR (codigo_vendedor), tem-se os dados atualizados.