Como definir relações entre tabelas numa base de dados do Access

Número original do KB: 304466

Nota

Novato: Requer conhecimentos da interface do utilizador em computadores de utilizador único. Este artigo aplica-se apenas a uma base de dados do Microsoft Access (.mdb ou .accdb).

Resumo

Este artigo descreve como definir relações numa base de dados do Microsoft Access. O artigo inclui os seguintes tópicos:

  • O que são relações de tabelas?
  • Tipos de relações de tabelas
    • Relações um-para-muitos
    • Relações muitos-para-muitos
    • Relações um-para-um
  • Como definir relações entre tabelas
    • Como definir uma relação um-para-muitos ou um-para-um
    • Como definir uma relação muitos-para-muitos
  • Integridade referencial
  • Atualizações e eliminações em cascata
  • Tipo de junção

O que são relações de tabelas?

Numa base de dados relacional, as relações permitem que evite dados redundantes. Por exemplo, se estiver a projetar uma base de dados que irá rastrear informações sobre livros, poderá ter uma tabela chamada "Títulos" que armazena informações sobre cada livro, como o título do livro, a data de publicação e o editor. Existem também informações que poderá querer armazenar sobre o editor, tais como, o número de telefone, endereço e código postal do editor. Se fosse armazenar todas estas informações na tabela "Títulos", o número de telefone do editor seria duplicado para cada título que o editor imprimisse.

Uma solução melhor é armazenar as informações do publicador apenas uma vez, numa tabela separada à qual vamos chamar "Editores". Em seguida, colocaria um ponteiro na tabela "Títulos" que referencia uma entrada na tabela "Publishers".

Para garantir que os dados permaneçam sincronizados, pode impor a integridade referencial entre as tabelas. As relações de integridade referencial ajudam a garantir que as informações numa tabela correspondem às informações na outra. Por exemplo, cada título na tabela "Títulos" tem de ser associado a um editor específico na tabela "Editores". Um título não pode ser adicionado à base de dados de um editor que não exista na base de dados.

As relações lógicas numa base de dados permitem que consulte dados eficientemente e crie relatórios.

Tipos de relações de tabelas

Uma relação funciona através da correspondência de dados em colunas-chave, geralmente colunas (ou campos) que têm o mesmo nome em ambas as tabelas. Na maioria dos casos, a relação liga a chave principal, ou a coluna com identificador única para cada linha, de uma tabela para um campo noutra tabela. A coluna na outra tabela é conhecida como "chave externa". Por exemplo, se quiser controlar as vendas de cada título do livro, crie uma relação entre a coluna de chave primária (vamos chamá-la de title_ID) na tabela "Títulos" e uma coluna na tabela "Vendas" com o nome title_ID. A coluna title_ID na tabela "Vendas" é a chave estrangeira.

Existem três tipos de relações entre tabelas. O tipo de relação criada depende de como as colunas relacionadas são definidas.

Relações um-para-muitos

Uma relação um-para-muitos é o tipo mais comum de relação. Neste tipo de relação, uma linha na tabela A pode ter muitas linhas correspondentes na tabela B. Mas uma linha na tabela B pode ter apenas uma linha correspondente na tabela A. Por exemplo, as tabelas "Editores" e "Títulos" têm uma relação de um-para-muitos. Ou seja, cada editor produz muitos títulos. Mas cada título vem de apenas um editor.

Uma relação de um-para-muitos é criada se apenas uma das colunas relacionadas for uma chave principal ou tiver uma restrição única.

Na janela de relação no Access, o lado da chave principal de uma relação de um-para-muitos é denotado por um número 1. O lado de chave estrangeira de uma relação é denotado por um símbolo infinito.

Captura de ecrã de um exemplo de relações um-para-muitos na janela de relações do Access.

Relações muitos-para-muitos

Numa relação de muitos-para-muitos, uma linha na tabela A pode ter muitas linhas correspondentes na tabela B e vice-versa. Cria esta relação definindo uma terceira tabela que é chamada de tabela de junção. A chave principal da tabela de junção consiste nas chaves estrangeiras tanto da tabela A quanto da tabela B. Por exemplo, a tabela "Autores" e a tabela "Títulos" têm uma relação de muitos-para-muitos, que é definida por uma relação de um-para-muitos de cada uma dessas tabelas para a tabela "TitleAuthors". A chave primária da tabela "TitleAuthors" é a combinação da coluna au_ID (a chave primária da tabela "Autores") e da coluna title_ID (a chave primária da tabela "Títulos").

Captura de ecrã de um exemplo de relação de muitos-para-muitos na janela de relações no Access.

Relações um-para-um

Numa relação de um-para-um, uma linha na tabela A não pode ter mais do que uma linha correspondente na tabela B e vice-versa. Uma relação um-para-um é criada se ambas as colunas relacionadas forem chaves principais ou tiverem restrições únicas.

Este tipo de relação não é comum, pois a maioria das informações relacionadas desta forma estaria numa tabela. Pode usar uma relação um-para-um para executar as seguintes ações:

  • Dividir uma tabela com muitas colunas.
  • Isolar parte de uma tabela por razões de segurança.
  • Armazenar dados de curta duração e que possam ser facilmente eliminados através da eliminação da tabela.
  • Armazenar informações que se apliquem apenas a um subconjunto da tabela principal.

No Access, o lado da chave principal de uma relação um-para-um é denotado por um símbolo de chave. O lado da chave estrangeira também é denotado por um símbolo de chave.

Como definir relações entre tabelas

Quando cria uma relação entre tabelas, os campos relacionados não têm que ter os mesmos nomes. No entanto, os campos relacionados têm de ter o mesmo tipo de dados, a menos que o campo de chave principal seja um campo AutoNumber. Pode combinar um campo AutoNumber com um campo Number somente se a propriedade FieldSize de ambos os campos correspondentes for a mesma. Por exemplo, pode corresponder um campo AutoNumber e um campo Number se a propriedade FieldSize de ambos os campos for Long Integer. Mesmo quando ambos os campos correspondentes são campos Number, devem ter a mesma definição de propriedade FieldSize.

Como definir uma relação um-para-muitos ou um-para-um

Para criar uma relação de um-para-muitos ou de um-para-um, siga estes passos:

  1. Feche todas as tabelas. Não pode criar ou alterar relações entre tabelas abertas.

  2. No Access 2002 ou Access 2003, siga estes passos:

    1. Prima F11 para mudar para a janela da Base de dados.
    2. No menu Ferramentas, clique em Relações.

    No Access 2007, Access 2010 ou Access 2013, clique em Relações no grupo Mostrar/Ocultar, no separador Ferramentas da Base de Dados.

  3. Se ainda não definiu nenhuma relação na sua base de dados, a caixa de diálogo Mostrar Tabela será apresentada automaticamente. Se pretender adicionar as tabelas que pretende relacionar, mas a caixa de diálogo Mostrar Tabela não aparece, clique em Mostrar Tabela no menu Relações.

  4. Clique duas vezes nos nomes das tabelas que pretende relacionar e, em seguida, feche a caixa de diálogo Mostrar Tabela. Para criar uma relação entre uma tabela e ela mesma, adicione essa tabela duas vezes.

  5. Arraste o campo que pretende relacionar de uma tabela para o campo relacionado na outra tabela. Para arrastar vários campos, prima Ctrl, clique em cada campo e, em seguida, arraste-os.

    Na maioria dos casos, arrasta o campo de chave principal (este campo é apresentado em texto em negrito) de uma tabela para um campo semelhante (este campo frequentemente tem o mesmo nome) que é chamado de chave estrangeira na outra tabela.

  6. A caixa de diálogo Editar Relações aparece. Certifique-se de que os nomes dos campos apresentados nas duas colunas estão corretos. Pode alterar os nomes se for necessário.

    Defina as opções de relação se for necessário. Se tiver de ter informações sobre um item específico na caixa de diálogo Editar Relações, clique no botão com ponto de interrogação e, em seguida, clique no item. (Estas opções serão explicadas em detalhe mais à frente neste artigo.)

  7. Clique em Criar para criar a relação.

  8. Repita os passos do 4 ao 7 para cada par de tabelas que pretende relacionar.

    Quando fecha a caixa de diálogo Editar Relações,o Access pergunta se pretende guardar o esquema. Se guarda o esquema ou não, as relações que criar são guardadas na base de dados.

    Nota

    Pode criar relações não apenas em tabelas, mas também em consultas. No entanto, a integridade referencial não é imposta com consultas.

Como definir uma relação muitos-para-muitos

Para criar uma relação de muitos-para-muitos, siga estes passos:

  1. Crie as duas tabelas que terão uma relação de muitos-para-muitos.

  2. Crie uma terceira tabela. Esta é a tabela de junção. Na tabela de junção, adicione novos campos que tenham as mesmas definições que os campos de chave principal de cada tabela que criou no passo 1. Na tabela de junção, os campos de chave principal funcionam como chaves estrangeiras. Pode adicionar outros campos à tabela de junção, tal como para qualquer outra tabela.

  3. Na tabela de junção, defina a chave principal para incluir os campos de chave principal das outras duas tabelas. Por exemplo, numa tabela de junção "TitleAuthors", a chave principal seria composta pelos campos OrderID e ProductID.

    Nota

    Para criar uma chave principal, siga estes passos:

    1. Abra uma tabela na vista Design.

    2. Selecione o campo ou campos que pretende definir como a chave principal. Para selecionar um campo, clique no seletor de linha para o campo pretendido. Para selecionar vários campos, mantenha a tecla Ctrl pressionada e, em seguida, clique no seletor de linha para cada campo.

    3. No Access 2002 ou no Access 2003, clique em Chave Principal na barra de ferramentas.

      No Access 2007, clique em Chave Principal, no grupo Ferramentas, no separador Design.

      Nota

      Se pretender que a ordem dos campos numa chave principal de vários campos seja diferente da ordem desses campos na tabela, clique em Índices, na barra de ferramentas, para apresentar a caixa de diálogo Índices e, em seguida, reordene os nomes dos campos para o índice chamado PrimaryKey.

  4. Defina uma relação de um-para-muitos entre cada tabela principal e a tabela de junção.

Integridade referencial

A integridade referencial é um sistema de regras que o Access usa para garantir que as relações entre registos em tabelas relacionadas sejam válidas e que o utilizador não exclui ou altera acidentalmente dados relacionados. Pode definir a integridade referencial quando todas as seguintes condições forem verdadeiras:

  • O campo de correspondência da tabela principal é uma chave principal ou tem um índice único.
  • Os campos relacionados têm o mesmo tipo de dados. Existem duas exceções. Um campo AutoNumber pode estar relacionado com um campo Number que tenha uma FieldSize definição de propriedade de Número Inteiro Longo, e um campo AutoNumber que tenha uma FieldSize definição de propriedade de ID de Replicação que pode estar relacionado com um campo Number que tenha uma FieldSize definição de propriedade de ID de Replicação.
  • Ambas as tabelas pertencem à mesma base de dados do Access. Se as tabelas estiverem vinculadas, terão de ser tabelas no formato Access e o utilizador terá de abrir a base de dados na qual são armazenadas, para definir a integridade referencial. A integridade referencial não pode ser imposta para tabelas vinculadas de bases de dados noutros formatos.

As seguintes regras aplicam-se quando usa a integridade referencial:

  • Não pode introduzir um valor no campo de chave estrangeira da tabela relacionada que não exista na chave principal da tabela principal. No entanto, pode introduzir um valor Nulo na chave estrangeira. Isto especifica que os registos não estão relacionados. Por exemplo, não pode ter um pedido que esteja atribuído a um cliente que não existe. No entanto, pode ter um pedido que não esteja atribuído a ninguém, introduzindo um valor Nulo no campo CustomerID.
  • Não é possível eliminar um registo de uma tabela principal se existirem registos correspondentes numa tabela relacionada. Por exemplo, não pode eliminar um registo de funcionário da tabela "Funcionários", se existirem pedidos atribuídos ao funcionário na tabela "Pedidos".
  • Não pode alterar um valor de chave principal na tabela principal se esse registo tiver registos relacionados. Por exemplo, não pode alterar o ID de um funcionário na tabela "Funcionários", se existirem pedidos atribuídos a esse funcionário na tabela "Pedidos".

Atualizações e eliminações em cascata

Para relações nas quais a integridade referencial é imposta, pode especificar se pretende que o Access atualize ou elimine automaticamente registos relacionados em cascata. Se definir estas opções, as operações de eliminação e atualização, que geralmente seriam impedidas pelas regras de integridade referencial, serão ativadas. Quando elimina registos ou altera valores da chave principal numa tabela principal, o Access efetua as alterações necessárias nas tabelas relacionadas, para preservar a integridade referencial.

Se clicar para selecionar a caixa de verificação Propagar Atualização dos Campos Relacionados quando definir uma relação, sempre que alterar a chave primária de um registo na tabela primária, o Microsoft Access atualiza automaticamente a chave primária para o novo valor em todos os registos relacionados. Por exemplo, se alterar o ID de um cliente na tabela "Clientes", o campo CustomerID na tabela "Pedidos" será automaticamente atualizado para cada um dos pedidos desse cliente, para que a relação não seja quebrada. Aceda às atualizações em cascata sem apresentar nenhuma mensagem.

Nota

Se a chave primária na tabela primária for um campo AutoNumber, selecionar a caixa de verificação Propagar Atualização dos Campos Relacionados não terá efeito, porque não pode alterar o valor num campo AutoNumber.

Se selecionar a caixa de verificação Propagar Eliminação dos Registos Relacionados quando definir uma relação, sempre que eliminar registos na tabela primária, o Access eliminará automaticamente registos relacionados na tabela relacionada. Por exemplo, se eliminar um registo de cliente da tabela "Clientes", todos os pedidos do cliente serão automaticamente eliminados da tabela "Pedidos". (Isto inclui registos na tabela "Detalhes do Pedido" relacionados com os registos de "Pedidos"). Quando elimina registos de um formulário ou folha de dados, com a caixa de verificação Propagar Eliminação dos Registos Relacionados selecionada, o Access avisa-o de que os registos relacionados também poderão ser eliminados. No entanto, quando elimina registos usando uma consulta de eliminação, o Access elimina automaticamente os registos em tabelas relacionadas sem apresentar um aviso.

Tipo de junção

Existem três tipos de junção. Pode vê-los na captura de ecrã seguinte:

Captura de ecrã das Propriedades de Associação, que mostra três tipos de associação.

A opção 1 define uma união interna. Uma união interna é uma união na qual os registos de duas tabelas são combinados nos resultados de uma consulta somente se os valores nos campos unidos satisfazerem uma condição especificada. Numa consulta, a união predefinida é uma união interna que seleciona registos somente se os valores nos campos unidos corresponderem.

A opção 2 define uma união externa à esquerda. Uma união externa à esquerda é uma união na qual todos os registos do lado esquerdo da operação LEFT JOIN na instrução de SQL da consulta são adicionados aos resultados da consulta, mesmo que não haja valores correspondentes no campo unido da tabela no lado direito.

A opção 3 define uma união externa à direita. Uma união externa à direita é uma união na qual todos os registos do lado direito da operação RIGHT JOIN na instrução de SQL da consulta são adicionados aos resultados da consulta, mesmo que não haja valores correspondentes no campo unido da tabela no lado esquerdo.