MySQL ::: Dicas & Truques ::: Chaves, Índices e Restrições de Integridade Referencial

Como criar chaves estrangeiras no MySQL - Como criar Foreign Keys em tabelas do MySQL

Quantidade de visualizações: 89679 vezes
O que é chave estrangeira (foreign key)?

O papel da chave estrangeira é manter uma referência a um registro presente em outra tabela. Imagine o seguinte cenário. Temos uma tabela livros e uma tabela autores. Neste cenário, um autor pode escrever vários livros e um livro pode ser escrito somente por um determinado autor. Aqui temos uma relação 1:N, ou seja, um para muitos: um autor pode escrever zero, um ou vários livros.

Comece analisando a tabela autores:

Field    Type               Null   Key    Default   Extra    
id       int(10) unsigned   NO     PRI    -         auto_increment    
nome     varchar(45)        NO            -                
email    varchar(45)        NO            -                
Como podemos ver, esta tabela possui três campos: id, nome e email. O campo id é do tipo int, auto-incremento e é a chave primária da tabela (não poderá haver ids repetidos nem o valor NULL). Esta tabela foi criada com o seguinte comando DDL CREATE TABLE:

CREATE TABLE autores(
  id int(10) unsigned NOT NULL auto_increment,
  nome varchar(45) NOT NULL,
  email varchar(45) NOT NULL,
  PRIMARY KEY(id)
)ENGINE=InnoDB;

Analise agora a tabela livros:

Field      Type                Null    Key    Default    Extra    
id         int(10) unsigned    NO      PRI    -          auto_increment    
titulo     varchar(45)         NO             -               
paginas    int(10) unsigned    NO             -               
id_autor   int(10) unsigned    NO             -               
Note que esta tabela possui os campos id, titulo, paginas e id_autor. Veja o comando DDL CREATE TABLE usado para sua criação:

CREATE TABLE livros(
  id INTEGER UNSIGNED NOT NULL DEFAULT NULL AUTO_INCREMENT,
  titulo VARCHAR(45) NOT NULL,
  paginas INTEGER UNSIGNED NOT NULL,
  id_autor INTEGER UNSIGNED NOT NULL,
  PRIMARY KEY(id)
)ENGINE = InnoDB;

O campo id é do tipo int, auto-incremento e foi marcado como chave primária. Dessa forma, o campo id identifica unicamente cada livro. O campo id_autor é do tipo int e sua função é guardar o id do autor que escreveu um determinado livro. Ao trazer o valor do campo id da tabela autores para o campo id_autor da tabela livros nós estamos relacionando as duas tabelas. O campo id_autor, neste cenário, é a chave estrangeira, pois seu valor sempre refletirá o valor do campo id da tabela autores (a única exceção é quando queremos deixar, temporariamente, um livro sem autor). Lembre-se, em uma relação 1:N, a chave estrangeira, em geral, ficará no lado N da relação.

Integridade Referencial (Restrições de Chave Estrangeira) - Referential Integrity (Foreign Key Constraints)

Imagine agora que você inseriu alguns registros na tabela autores e na tabela livros. Todas as vezes que o valor do campo id_autor na tabela livros for igual ao valor do campo id na tabela autores nós estaremos criando um relação autor-livro. É possível, a qualquer momento, listar um livro e saber de imediato o id do seu autor (isso permite fazer um join com a tabela autores para obter os dados do respectivo autor).

Mas, o que acontecerá se excluirmos um registro na tabela autores e, mais tarde, descobrirmos que o campo id_autor da tabela livros guardava uma referência para o autor excluído? Teremos a quebra da integridade referencial. Para evitar tais situações, é responsabilidade do programador escrever códigos de verificações para prevenir estas ocorrências.

Os bancos de dados, e principalmente o MySQL, possuem mecanismos para reforçar esta proteção: restrições de chave estrangeira. As restrições de chave estrangeira asseguram duas situações possíveis:

1) Não permitir que um autor seja excluído quando qualquer livro possuir uma referência a ele;

2) Se o autor for excluído, todos os livros que o referenciam também o serão.

Definindo a chave estrangeira na tabela livros usando o atributo CONSTRAINT FOREIGN KEY REFERENCES

Vamos agora reescrever o comando DDL CREATE TABLE para a tabela livros de forma a aplicar as restrições de chaves estrangeiras. Veja a nova versão:

CREATE TABLE livros(
  id INTEGER UNSIGNED NOT NULL DEFAULT NULL AUTO_INCREMENT,
  titulo VARCHAR(45) NOT NULL,
  paginas INTEGER UNSIGNED NOT NULL,
  id_autor INTEGER UNSIGNED NOT NULL,
  PRIMARY KEY(id),
  CONSTRAINT livros_autores FOREIGN KEY(id_autor) REFERENCES autores(id)
)ENGINE = InnoDB;

A estrutura da tabela livros será alterada para aquela mostrada abaixo:

Field      Type                Null   Key    Default    Extra    
id         int(10) unsigned    NO     PRI    -          auto_increment    
titulo     varchar(45)         NO            -              
paginas    int(10) unsigned    NO            -                
id_autor   int(10) unsigned    NO     MUL    -
Veja que agora o campo id_autor foi sinalizado como MUL, ou seja, parte de um índice não único. Experimente agora inserir dados em ambas as tabelas e faça relacionamentos entre autores e livros. Tente excluir um autor que tenha um livro relacionado a ele. Imediatamente o MySQL abortará a operação com a seguinte mensagem de erro:

ErrorNr. 1451: Cannot delete or update a parent row: a foreign key constraint fails (`estudos/livros`, CONSTRAINT `livros_autores` FOREIGN KEY (`id_autor`) REFERENCES `autores` (`id`))

Em mais dicas desta seção você aprenderá a usar as cláusulas ON DELETE e ON UPDATE e as ações RESTRICT, SET NULL, CASCADE e NO ACTION. Todas estas cláusulas e ações são usadas para reforçar a integridade referencial de suas bases de dados.


C# ::: Windows Forms ::: ListBox

Como pesquisar e retornar o índice de um item na ListBox do C# Windows Forms

Quantidade de visualizações: 8839 vezes
Nesta dica mostrarei como podemos pesquisar um valor em uma ListBox do C# Windows Forms. Se o item pesquisado estiver na lista nós vamos retornar o índice de sua ocorrência.

Veja o código completo para o exemplo, disparado a partir do evento Click de um botão Button:

private void button2_Click(object sender, EventArgs e)
{
  // pesquisa um item na ListBox
  int pos = listBox1.Items.IndexOf("São Paulo");
  if (pos > -1){
    MessageBox.Show("O item pesquisado foi encontrado na posição " 
     + pos);
  }
  else{
    MessageBox.Show("O item pesquisado não foi encontrado");
  }
}



Ruby ::: Dicas & Truques ::: Arrays e Matrix (Vetores e Matrizes)

Como adicionar itens ao final de um array em Ruby usando a função push()

Quantidade de visualizações: 7912 vezes
Em algumas situações nós precisamos adicionar novos elementos ao final de um array em Ruby. Para isso nós podemos usar a função push() do objeto Array.

Veja como isso pode ser feito no código abaixo:

# vamos criar um array de nomes
nomes = []

# Lê entrada até que o valor -1 seja
# fornecido
loop do
  print "Digite um nome (-1 para sair): "
  nome = gets.chomp
  
  # vamos adicionar este nome no final do
  # array
  if nome != "-1"
    nomes.push(nome) # adiciona o nome ao array
  end
  
  # vamos sair do laço se o valor for "-1"
  if nome == "-1"
    break
  end
end

# Exibe todos os valores do array
puts "\nOs nomes fornecidos foram:"
nomes.each do | nome |
  puts nome
end

Ao executar este código Ruby nós teremos o seguinte resultado:

Digite um nome (-1 para sair): MARCELO
Digite um nome (-1 para sair): JOANA
Digite um nome (-1 para sair): OSMAR
Digite um nome (-1 para sair): JAQUELINE
Digite um nome (-1 para sair): -1

Os nomes fornecidos foram:
MARCELO
JOANA
OSMAR
JAQUELINE


Java ::: Dicas & Truques ::: Matemática e Estatística

Como converter de binário para decimal usando o método parseInt() da classe Integer da linguagem Java

Quantidade de visualizações: 15859 vezes
Nesta dica eu mostro como podemos usar o método parseInt() da classe Integer do Java para converter um valor binário em um valor decimal. Para isso só precisamos forcecer o valor 2 como segundo argumento para o método parseInt().

Veja o código completo para o exemplo:

package arquivodecodigos;

public class Estudos{
  public static void main(String args[]){
    String binario = "00000110";
     
    // efetua a conversão de binário para
    // decimal
    int decimal = Integer.parseInt(binario, 2);
 
    // exibe o resultado
    System.out.println("O valor binário " + binario + 
      " convertido para decimal é: " + decimal);
 
    System.exit(0);
  }
}

Ao executar este exemplo nós teremos o seguinte resultado:

O valor binário 00000110 convertido para decimal é: 6


Java ::: Dicas & Truques ::: Threads

Threads em Java - Como usar a interface Runnable da Java API em suas aplicações

Quantidade de visualizações: 17883 vezes
A interface pública Runnable deve ser implementada em nossas classes quando queremos que instâncias destas possam ser executadas por uma thread. Esta interface está no pacote java.lang e entre as classes que a implementam podemos citar AsyncBoxView.ChildState, FutureTask, RenderableImageProducer, Thread e TimerTask.

Esta interface apresenta apenas um método, a saber:

public void run();
Assim, uma classe que implementa Runnable deverá redefinir este método, sem argumentos, e fornecer a funcionalidade desejada.

Este interface foi idealizada para fornecer um protocolo comum para objetos que têm como objetivo executar determinadas porções de código enquanto ativos. Por exemplo, Runnable é implementada pela classe Thread. Estar ativa significa que uma thread foi iniciada e ainda não finalizou sua tarefa.

Além disso, a interface Runnable fornece meios para que uma classe esteja ativa sem fazer sub-classe de Thread. Uma classe que implementa Runnable pode ser executada sem fazer sub-classe de Thread criando-se uma instância de Thread e fornecendo tal classe como alvo. Na maioria dos casos, a interface Runnable deve ser usada se estivermos planejando apenas sobrescrever o método run() e nenhum outro método da classe Thread. Isso é importante, uma vez que não devemos extender classes a menos que tenhamos a intenção de modificar ou extender o comportamento fundamental da classe.

Veja uma aplicação na qual temos uma classe que implementa Runnable. Note como criamos instâncias de Thread e fornecemos nossa classe como alvo:

// criamos uma classe que servirá como thread
class MinhaThread implements Runnable{
  private String nome;  

  public MinhaThread(String nome){
    this.nome = nome;
  }   

  public void run(){
    for(int i = 1; i <= 20; i++){
      System.out.println(nome + ": " + i);
    }
  }
}

public class Estudos{
  public static void main(String[] args){
    // vamos criar duas threads
    MinhaThread mt1 = new MinhaThread("Thread 1");
    Thread t1 = new Thread(mt1);
    t1.start();    

    MinhaThread mt2 = new MinhaThread("Thread 2");
    Thread t2 = new Thread(mt2);
    t2.start();

    System.exit(0);
  }
}



Python ::: Dicas & Truques ::: Geometria, Trigonometria e Figuras Geométricas

Como testar se um ponto está dentro de um círculo em Python - Desenvolvimento de Games com Python

Quantidade de visualizações: 1253 vezes
Quando estamos trabalhando com computação gráfica, geometria e trigonometria ou desenvolvimento de jogos em Python, é comum precisarmos verificar se um determinado ponto (uma coordenada x, y) está contido dentro de um círculo.

Para melhor entendimento, veja a imagem a seguir:



Veja que temos um círculo com raio igual a 115 e com centro nas coordenadas (x = 205; y = 166). Temos também dois pontos. O ponto vermelho está nas coordenadas (x = 140; y = 90) e o ponto azul está nas coordenadas (x = 330; y = 500.

Como podemos ver na imagem, o ponto vermelho está dentro do círculo, enquanto o ponto azul está fora. E nosso intenção nesta dica é escrever o código Python que permite fazer essa verificação. Tenha em mente que está técnica é muito útil para o teste de colisões no desenvolvimento de games.

Veja o código completo para o exemplo:

# vamos importar o módulo Math
import math

# vamos declarar a classe Circulo
class Circulo:
  # construtor da classe
  def __init__(self, xc, yc, raio):
    self.xc = xc
    self.yc = yc
    self.raio = raio
  
# agora vamos declarar a classe Ponto
class Ponto:
  def __init__(self, x, y):
    self.x = x # coordenada x
    self.y = y # coordenada y	

# método principal
def main():
  # vamos criar um objeto Circulo
  c = Circulo(205, 166, 115)
  # vamos criar um objeto Ponto
  p = Ponto(140, 90)
  
  # vamos verificar se o ponto está dentro do
  # círculo
  dx = p.x - c.xc;
  dy = p.y - c.yc;
  
  if((math.pow(dx, 2) + math.pow(dy, 2)) < math.pow(c.raio, 2)):
    print("O ponto está dentro do círculo")
  else:
    print("O ponto NÃO está dentro do círculo")

if __name__== "__main__":
  main()

Ao executar este código Python nós teremos o seguinte resultado:

O ponto está dentro do círculo.

Experimente com círculos de raios e coordenadas centrais diferentes e também com pontos em várias coordenadas e veja como os resultados são interessantes.


Python ::: Desafios e Lista de Exercícios Resolvidos ::: Pandas Python Library

Exercício Resolvido de Python Pandas - Como testar se um DataFrame do Pandas possui algum valor não informado

Quantidade de visualizações: 786 vezes
Pergunta/Tarefa:

Dado o seguinte arquivo CSV (carros.csv):

Marca;Modelo;Ano;Valor;Vendido
Fiat;Sienna;2010;23500.00;S
Volkswagen;Polo;2009;31453.00;N
Volkswagen;;2001;19200.00;S
Fiat;Palio;1995;7500.00;S
Honda;Civic;;42000.00;S
Renault;Sandero;2010;52000.00;N


Escreva um programa Python Pandas que carrega este arquivo .csv em um DataFrame, exiba o seu conteúdo e informe se o DataFrame contém algum valor não informado para qualquer uma das colunas. Analisando o arquivo vemos que há dois valores ausentes: o modelo do veículo na quarta linha e o ano do veículo na sexta linha.

Sua saída deverá ser parecida com:

Os dados do DataFrame são:

        Marca   Modelo     Ano    Valor Vendido
0        Fiat   Sienna  2010.0  23500.0       S
1  Volkswagen     Polo  2009.0  31453.0       N
2  Volkswagen      NaN  2001.0  19200.0       S
3        Fiat    Palio  1995.0   7500.0       S
4       Honda    Civic     NaN  42000.0       S
5     Renault  Sandero  2010.0  52000.0       N

Há valores ausentes no DataFrame
Resposta/Solução:

Veja a resolução comentada deste exercício em Python:

# importamos a biblioteca Pandas
import pandas as pd
 
def main():
  # vamos carregar os dados do arquivo .csv
  df = pd.read_csv("C:\\estudos_python\\carros.csv",
   delimiter=";")
 
  # vamos mostrar o DataFrame resultante
  print("Os dados do DataFrame são:\n")
  print(df)

  # vamos testar se existe algum valor ausenta em alguma
  # das colunas do DataFrame
  if df.isnull().values.any():
    print("\nHá valores ausentes no DataFrame")
  else:
    print("\nNão existe valores ausentes no DataFrame")

if __name__== "__main__":
  main()



C# ::: Dicas & Truques ::: Matemática e Estatística

Como gerar um número aleatório usando a função Next() da classe Random do C#

Quantidade de visualizações: 23833 vezes
Este exemplo mostra como gerar números randômicos usando C#. Para isso nós vamos usar o método Next() da classe Random. Este método retorna um número inteiro maior ou igual a zero e menor que a constante MaxValue (cujo valor é 2.147.483.647).

Observe que cada chamada a Next() gera um número aleatório diferente, não havendo a necessidade de criar um novo objeto da classe Random para cada número desejado. Eis o código:

static void Main(string[] args){
  // cria um objeto da classe Random
  Random rnd = new Random();
  
  // gera o número aleatório na faixa
  // 0 até MaxValue (2.147.483.647)
  int numero = rnd.Next();

  // exibe o resultado
  Console.Write("O número gerado foi: {0}", numero);

  Console.WriteLine("\n\nPressione uma tecla para sair...");
  Console.ReadKey();
}

Ao executar este código C# nós teremos o seguinte resultado:

O número gerado foi: 504


Python ::: Desafios e Lista de Exercícios Resolvidos ::: Recursão (Recursividade)

Exercícios Resolvidos de Python - Uma função recursiva que conta quantas vezes um valor inteiro k ocorre em um vetor de inteiros

Quantidade de visualizações: 574 vezes
Pergunta/Tarefa:

Escreva uma função recursiva em Python que conta quantas vezes um valor inteiro k ocorre em um vetor de 10 inteiros. Sua função deverá ter a seguinte assinatura:

# função recursiva que recebe um valor e informa quantas vezes
# ele aparece no vetor também informado
def quant_repeticoes(indice, valor, vetor):
  # sua implementação aqui
Seu programa deverá solicitar ao usuário os valores do vetor e o valor a ser pesquisado.

Sua saída deverá ser parecida com:

Informe o 1 valor: 2
Informe o 2 valor: 7
Informe o 3 valor: 4
Informe o 4 valor: 7
Informe o 5 valor: 1

Informe o valor a ser pesquisado no vetor: 7
O valor informado se repete 2 vezes.
Resposta/Solução:

Veja a resolução comentada deste exercício usando Python:

# método principal
def main():
  # vamos declarar um vetor de 10 inteiros
    valores = [0 for x in range(5)]

    # vamos pedir ao usuário que informe os valores do vetor
    for i in range(len(valores)):
      valores[i] = int(input("Informe o %d.o valor: " % ((i + 1))))
    
    # agora vamos pedir para informar o valor a ser pesquisado
    valor = int(input("\nInforme o valor a ser pesquisado no vetor: "))
    
    # e vamos ver a quantidade de repetições
    repeticoes = quant_repeticoes(0, valor, valores)
    print("O valor informado se repete {0} vezes.".format(repeticoes))

# função recursiva que recebe um valor e informa quantas vezes
# ele aparece no vetor também informado
def quant_repeticoes(indice, valor, vetor):
  if indice == len(vetor) - 1: # caso base...hora de parar a recursividade
    if vetor[indice] == valor:
      return 1 # mais um repetição foi encontrada
  else: # dispara mais uma chamada recursiva
    if vetor[indice] == valor: # houve mais uma repetição
      return 1 + quant_repeticoes(indice + 1, valor, vetor)
    else:
      return 0 + quant_repeticoes(indice + 1, valor, vetor) # não repetiu

  return 0 # só para deixar o compilador satisfeito...esta linha nunca é executada

if __name__== "__main__":
  main()



Java ::: Java Swing - JTable e classes relacionadas ::: JTable

Como aplicar cores alternadas às linhas de uma JTable do Java Swing

Quantidade de visualizações: 255 vezes
Nesta dica eu mostrarei como aplicar o tão falado "efeito zebrinha" nas linhas de uma tabela JTable do Java Swing. A técnica é muito simples é, uma vez aprendida, possibilita a criação de códigos cada vez mais interessantes.

Veja como efetuo uma chamada ao método prepareRenderer() para obter um Component representando a célula que está sendo renderizada. Se o índice da linha da célula for par e não estiver selecionada, nós efetuamos uma chamada à setBackground() da classe Component para definir a sua cor de fundo.

Veja o código completo para o exemplo:

package arquivodecodigos;

import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;

public class Estudos extends JFrame {
  public Estudos() {
    super("Exemplo de uma tabela com efeito zebrinha");

    // colunas da tabela
    String[] colunas = {"Cidade", "Estado", "Habitantes"};

    // conteúdo da tabela   
    Object[][] conteudo = {
      {"Goiânia", "GO", "43.023.432"},
      {"São Paulo", "SP", "5.343.234"},
      {"Rio de Janeiro", "RJ", "6.434.212"},
      {"Jussara", "GO", "87.454"},
      {"Barra do Garças", "MT", "64.344"}
    };

    // constrói a tabela
    final JTable tabela = new JTable(conteudo, colunas) {
      @Override
      public Component prepareRenderer(TableCellRenderer renderer,
        int rowIndex, int vColIndex) {
        
        Component c = super.prepareRenderer(renderer, rowIndex, vColIndex);
        
        if (rowIndex % 2 == 0 && !isCellSelected(rowIndex, vColIndex)) {
          c.setBackground(Color.YELLOW);
        } 
        else {
          c.setBackground(getBackground());
        }
        return c;
      }
    };

    tabela.setPreferredScrollableViewportSize(new Dimension(350, 150));

    Container c = getContentPane();
    c.setLayout(new FlowLayout());

    JScrollPane scrollPane = new JScrollPane(tabela);
    c.add(scrollPane);

    setSize(400, 300);
    setVisible(true);
  }

  public static void main(String args[]) {
    Estudos app = new Estudos();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

Ao executar este código Java Swing nós teremos o seguinte resultado:



Carregar Publicações Anteriores


Nossas 20 dicas & truques de programação mais populares

Você também poderá gostar das dicas e truques de programação abaixo

Nossas 20 dicas & truques de programação mais recentes

Últimos Projetos e Códigos Fonte Liberados Para Apoiadores do Site

Últimos Exercícios Resolvidos

E-Books em PDF

E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser.

Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book
E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser.

Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: C
6º lugar: Delphi
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2025 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 25 usuários muito felizes estudando em nosso site.