Come definire le relazioni tra tabelle in un database di Access

Numero della Knowledge Base originale: 304466

Nota

Utenti inesperti: è richiesta la conoscenza dell'interfaccia utente dei computer a utente singolo. Questo articolo si applica solo a un database di Microsoft Access (.mdb o .accdb).

Riepilogo

In questo articolo viene descritto come definire le relazioni in un database di Microsoft Access. In questo articolo vengono affrontati i seguenti argomenti:

  • Che cosa sono le relazioni tra tabelle?
  • Tipi di relazioni tra tabelle
    • Relazioni uno-a-molti
    • Relazioni molti-a-molti
    • Relazioni uno-a-uno
  • Come definire le relazioni tra tabelle
    • Come definire una relazione uno-a-molti o uno-a-uno
    • Come definire una relazione molti-a-molti
  • Integrità referenziale
  • Aggiornamenti ed eliminazioni a catena
  • Tipi di join

Che cosa sono le relazioni tra tabelle?

In un database relazionale, le relazioni consentono di evitare dati ridondanti. Ad esempio, se si sta progettando un database che tiene traccia di informazioni sui libri, si potrebbe avere una tabella denominata "Titoli" in cui sono memorizzate le informazioni su ogni libro, ad esempio il titolo, la data di pubblicazione e l'editore. Si potrebbero inoltre voler archiviare le informazioni sull'editore, ad esempio il numero di telefono, l'indirizzo e il CAP. Se si dovessero memorizzare tutte queste informazioni nella tabella "Titoli", il numero di telefono dell'editore verrebbe duplicato per ogni titolo stampato dall'editore stesso.

Una soluzione migliore è quella di memorizzare le informazioni sull'editore una sola volta, in una tabella separata che sarà chiamata "Editori". Nella tabella "Titoli", viene inserito un puntatore che fa riferimento a una voce della tabella "Editori".

Per assicurarsi che i dati rimangano sincronizzati, è possibile applicare l'integrità referenziale tra le tabelle. Le relazioni di integrità referenziale consentono di fare in modo che le informazioni contenute in una tabella corrispondano alle informazioni in un'altra. Ad esempio, ogni titolo nella tabella "Titoli" deve essere associato a un editore specifico nella tabella "Editori". Non è possibile aggiungere un titolo al database per un editore non esistente nel database.

Le relazioni logiche in un database consentono di eseguire query sui dati in modo efficiente e di creare report.

Tipi di relazioni tra tabelle

Una relazione funziona facendo corrispondere i dati nelle colonne chiave, in genere colonne (o campi) che hanno lo stesso nome in entrambe le tabelle. Nella maggior parte dei casi, la relazione collega la chiave primaria o la colonna dell'identificatore univoco di ogni riga da una tabella a un campo in un'altra tabella. La colonna nell'altra tabella è nota come "chiave esterna". Ad esempio, se si desidera tenere traccia delle vendite di ogni titolo di libro, si crea una relazione tra la colonna chiave primaria (chiamiamola title_ID) nella tabella "Titoli" e una colonna nella tabella "Vendite" denominata title_ID. La colonna title_ID nella tabella "Vendite" è la chiave esterna.

Esistono tre tipi di relazioni tra tabelle. Il tipo di relazione creato dipende da come vengono definite le colonne correlate.

Relazioni uno-a-molti

Il tipo di relazione più comune è uno-a-molti. In questo tipo di relazione, a una riga nella tabella A possono corrisponde più righe nella tabella B, ma una riga nella tabella B può avere una sola riga corrispondente nella tabella A. Ad esempio, le tabelle "Editori" e "Titoli" hanno una relazione uno-a-molti. Ovvero, ogni editore produce più titoli. Ogni titolo, però, proviene da un solo editore.

Viene creata una relazione uno-a-molti se solo una delle colonne correlate è una chiave primaria o ha un vincolo univoco.

Nella finestra della relazione in Access, il lato chiave primaria di una relazione uno-a-molti è indicato dal numero 1. Il lato chiave esterna di una relazione è indicato da un simbolo di infinito.

Screenshot di un esempio di relazioni uno a molti nella finestra delle relazioni in Access.

Relazioni molti-a-molti

In una relazione molti-a-molti, una riga nella tabella A può avere molte righe corrispondenti nella tabella B e viceversa. Per creare una relazione di questo tipo, definire una terza tabella denominata tabella di unione. La chiave primaria della tabella di unione è costituita dalle chiavi esterne della tabella A e della tabella B. Ad esempio, la tabella "Autori" e la tabella "Titoli" hanno una relazione molti-a-molti definita da una relazione uno-a-molti da ognuna di queste tabelle alla tabella "TitoloAutori". La chiave primaria della tabella "TitoloAutori" è la combinazione della colonna au_ID (chiave primaria della tabella "Autori") e della colonna title_ID (chiave primaria della tabella "Titoli").

Screenshot di un esempio di relazioni molti a molti nella finestra delle relazioni in Access.

Relazioni uno-a-uno

In una relazione uno-a-uno, una riga nella tabella A non può avere più di una riga corrispondente nella tabella B e viceversa. Viene creata una relazione uno-a-uno se entrambe le colonne correlate sono chiavi primarie o hanno vincoli univoci.

Questo tipo di relazione non è comune, perché la maggior parte delle informazioni correlate in questo modo sarebbero contenute in un'unica tabella. È possibile utilizzare una relazione uno-a-uno per effettuare le azioni seguenti:

  • Dividere una tabella con molte colonne.
  • Isolare parte di una tabella per motivi di sicurezza.
  • Archiviare i dati di breve durata che potrebbero essere eliminati facilmente eliminando la tabella.
  • Archiviare le informazioni che valgono solo per un sottoinsieme della tabella principale.

In Access, il lato chiave primaria di una relazione uno-a-uno è indicato dal simbolo di una chiave. Anche il lato della chiave esterna è indicato dal simbolo di una chiave.

Come definire le relazioni tra tabelle

Quando si crea una relazione tra tabelle, i campi correlati non devono contenere gli stessi nomi. Tuttavia, i campi correlati devono avere lo stesso tipo di dati, a meno che il campo chiave primaria non sia un campo Numerazione automatica. È possibile associare un campo Numerazione automatica a un campo numerico solo se la proprietà Dimensione campo di entrambi i campi corrispondenti è la stessa. Ad esempio, è possibile associare un campo Numerazione automatica e un campo numerico se la FieldSizeproperty di entrambi i campi è Long Integer. Anche quando entrambi i campi corrispondenti sono campi numerici, è necessario che abbiano la stessa impostazione della proprietà Dimensione campo.

Come definire una relazione uno-a-molti o uno-a-uno

Per creare una relazione uno-a-molti o uno-a-uno, attenersi alla seguente procedura:

  1. Chiudere tutte le tabelle. Non è possibile creare o modificare relazioni tra tabelle aperte.

  2. In Access 2002 o Access 2003, attenersi alla seguente procedura:

    1. Premere F11 per passare alla finestra database.
    2. Nel menu Strumenti, fare clic su Relazioni.

    In Access 2007, Access 2010 o Access 2013, fare clic su Relazioni nel gruppo Mostra/Nascondi della scheda Strumenti database.

  3. Se non è stata ancora definita alcuna relazione nel database, viene visualizzata automaticamente la finestra di dialogo Mostra tabella. Se si desidera aggiungere le tabelle da correlare, ma la finestra di dialogo Mostra tabella non viene visualizzata, fare clic su Mostra tabella nel menu Relazioni.

  4. Fare doppio clic sui nomi delle tabelle che si desidera correlare, quindi chiudere la finestra di dialogo Mostra tabella. Per creare una relazione tra una tabella e se stessa, aggiungere tale tabella due volte.

  5. Trascinare il campo che si desidera correlare da una tabella al campo correlato nell'altra tabella. Per trascinare più campi, premere CTRL, fare clic su ogni campo e quindi trascinarli.

    Nella maggior parte dei casi, si trascina il campo chiave primaria (questo campo viene visualizzato in grassetto) da una tabella a un campo simile (questo campo ha spesso lo stesso nome) che viene indicato come chiave esterna nell'altra tabella.

  6. Verrà visualizzata la finestra di dialogo Modifica relazioni. Assicurarsi che i nomi dei campi visualizzati nelle due colonne siano corretti. È possibile modificare i nomi, se necessario.

    Impostare le opzioni di relazione, se necessario. Se è necessario disporre di informazioni su un elemento specifico nella finestra di dialogo Modifica relazioni, fare clic sul pulsante con il punto interrogativo e quindi sull'elemento. (Queste opzioni verranno spiegate in dettaglio più avanti in questo articolo.)

  7. Fare clic su Crea per creare la relazione.

  8. Ripetere i passaggi da 4 a 7 per ogni coppia di tabelle che si desidera correlare.

    Quando si chiude la finestra di dialogo Modifica relazioni,Access chiederà se si desidera salvare il layout. A prescindere dal fatto che il layout venga salvato o meno, le relazioni create vengono salvate nel database.

    Nota

    È possibile creare relazioni non solo nelle tabelle, ma anche nelle query. Tuttavia, l'integrità referenziale non viene applicata con le query.

Come definire una relazione molti-a-molti

Per creare una relazione molti-a-molti, attenersi alla seguente procedura:

  1. Creare le due tabelle che avranno una relazione molti-a-molti.

  2. Creare una terza tabella. Questa è la tabella di collegamento. Nella tabella di collegamento, aggiungere nuovi campi con le stesse definizioni dei campi chiave primaria di ogni tabella creata nel passaggio 1. Nella tabella di unione, i campi chiave primaria assumono la funzione di chiavi esterne. È possibile aggiungere altri campi alla tabella di unione, come per qualsiasi altra tabella.

  3. Nella tabella di unione impostare la chiave primaria in modo da includere i campi chiave primaria delle altre due tabelle. Ad esempio, in una tabella di collegamento "TitoloAutori", la chiave primaria sarebbe costituita dai campi OrderID e ProductID.

    Nota

    Per creare una chiave primaria, attenersi alla seguente procedura:

    1. Aprire una tabella in visualizzazione Struttura.

    2. Selezionare il campo o i campi che si desidera definire come chiave primaria. Per selezionare un campo, fare clic sul selettore di riga per il campo desiderato. Per selezionare più campi, tenere premuto il tasto CTRL e quindi fare clic sul selettore di riga per ogni campo.

    3. In Access 2002 o Access 2003, fare clic su Chiave primaria sulla barra degli strumenti.

      In Access 2007, fare clic su Chiave primaria nel gruppo Strumenti della scheda Struttura.

      Nota

      Se si desidera che l'ordine dei campi in una chiave primaria a più campi sia diverso da quello dei campi della tabella, fare clic su Indici sulla barra degli strumenti per visualizzare la finestra di dialogo Indici e quindi riordinare i nomi dei campi per l'indice denominato ChiavePrimaria.

  4. Definire una relazione uno-a-molti tra ogni tabella primaria e la tabella di collegamento.

Integrità referenziale

L'integrità referenziale è un sistema di regole utilizzato da Access per assicurarsi che le relazioni tra i record nelle tabelle correlate siano valide e che i dati correlati non vengano eliminati o modificati accidentalmente. È possibile impostare l'integrità referenziale quando tutte le condizioni seguenti sono vere:

  • Il campo corrispondente della tabella primaria è una chiave primaria o ha un indice univoco.
  • I campi correlati hanno lo stesso tipo di dati. Esistono due opzioni: Un campo Numerazione automatica può essere correlato a un campo Numerico con FieldSize un'impostazione di proprietà Long Integer e un campo Numerazione automatica conFieldSize un'impostazione della proprietà ID replica può essere correlato a un campo Numerico conFieldSize un'impostazione della proprietà ID replica.
  • Entrambe le tabelle appartengono allo stesso database di Access. Se le tabelle sono tabelle collegate, devono essere tabelle in formato Access ed è necessario aprire il database in cui sono archiviate per impostare l'integrità referenziale. L'integrità referenziale non può essere applicata per le tabelle collegate da database in altri formati.

Quando si utilizza l'integrità referenziale, si applicano le regole seguenti:

  • Non è possibile immettere un valore nel campo chiave esterna della tabella correlata che non esiste nella chiave primaria della tabella primaria. Tuttavia, è possibile immettere un valore Null nella chiave esterna. Ciò specifica che i record non sono correlati. Ad esempio, non è possibile avere un ordine assegnato a un cliente che non esiste. Tuttavia, è possibile avere un ordine assegnato a nessuno immettendo un valore Null nel campo ID Cliente.
  • Non è possibile eliminare un record da una tabella primaria se esistono record corrispondenti in una tabella correlata. Ad esempio, non è possibile eliminare un record di un dipendente dalla tabella "Dipendenti" se sono presenti ordini assegnati al dipendente nella tabella "Ordini".
  • Non è possibile modificare un valore di chiave primaria nella tabella primaria se tale record contiene record correlati. Ad esempio, non è possibile modificare l'ID di un dipendente nella tabella "Dipendenti" se sono presenti ordini assegnati a tale dipendente nella tabella "Ordini".

Aggiornamenti ed eliminazioni a catena

Per le relazioni in cui viene applicata l'integrità referenziale, è possibile specificare se si desidera che Access aggiorni a catena o elimini a catena i record correlati. Se si impostano queste opzioni, si abilitano le operazioni di eliminazione e aggiornamento che in genere verrebbero impedite dalle regole di integrità referenziale. Quando si eliminano record o si modificano i valori di chiave primaria in una tabella primaria, Access apporta le modifiche necessarie alle tabelle correlate per mantenere l'integrità referenziale.

Se si fa clic per selezionare la casella di controllo Aggiorna campi correlati a catena quando si definisce una relazione, ogni volta che si modifica la chiave primaria di un record nella tabella primaria, Microsoft Access aggiorna automaticamente la chiave primaria al nuovo valore in tutti i record correlati. Ad esempio, se si modifica l'ID di un cliente nella tabella "Clienti", il campo ID Cliente nella tabella "Ordini" viene aggiornato automaticamente per ogni ordine del cliente in modo che la relazione non venga interrotta. Access esegue a catena gli aggiornamenti senza visualizzare alcun messaggio.

Nota

Se la chiave primaria nella tabella primaria è un campo Numerazione automatica, la selezione della casella di controllo Aggiorna campi correlati a catena non ha alcun effetto perché non è possibile modificare il valore in un campo Numerazione automatica.

Se si seleziona la casella di controllo Elimina record correlati a catena quando si definisce una relazione, ogni volta che si eliminano record nella tabella primaria, Access elimina automaticamente i record correlati nella tabella correlata. Ad esempio, se si elimina un record cliente dalla tabella "Clienti", tutti gli ordini del cliente vengono eliminati automaticamente dalla tabella "Ordini". (Sono inclusi i record nella tabella "Dettagli ordine" correlati ai record "Ordini"). Quando si eliminano record da un modulo o da un foglio dati quando è selezionata la casella di controllo Elimina record correlati a catena, Access segnala che i record correlati potrebbero venire cancellati. Tuttavia, quando si eliminano record utilizzando una query di eliminazione, Access elimina automaticamente i record nelle tabelle correlate senza visualizzare un avviso.

Tipi di join

Esistono tre tipi di join. Vengono indicati nello screenshot seguente:

Screenshot delle proprietà join, che mostra tre tipi di join.

L'opzione 1 definisce un inner join. Un inner join è un join in cui i record di due tabelle vengono combinati nei risultati di una query solo se i valori nei campi uniti soddisfano una condizione specificata. In una query, il join predefinito è un inner join che seleziona i record solo se i valori nei campi uniti sono corrispondenti.

L'opzione 2 definisce un left outer join. Un left outer join è un join in cui tutti i record dal lato sinistro dell'operazione LEFT JOIN nell'istruzione SQL della query vengono aggiunti ai risultati della query, anche se non sono presenti valori corrispondenti nel campo unito dalla tabella sul lato destro.

L'opzione 3 definisce un right outer join. Un right outer join è un join in cui tutti i record dal lato destro dell'operazione RIGHT JOIN nell'istruzione SQL della query vengono aggiunti ai risultati della query, anche se non sono presenti valori corrispondenti nel campo unito dalla tabella sul lato sinistro.