Come creare relazioni tra tabelle già piene di dati in Access: tutorial pratico

Per creare relazioni tra tabelle già piene di dati in Access devi prima verificare qualità e compatibilità dei dati esistenti. La relazione può essere disegnata nella finestra Relazioni, ma l’integrità referenziale verrà rifiutata se esistono chiavi esterne senza corrispondenza, duplicati sul lato uno, tipi incompatibili o valori che violano le regole. Il metodo sicuro è: backup, analisi, pulizia, creazione della relazione, attivazione dell’integrità e test.

Indice

  • Perché i dati esistenti complicano la relazione
  • Backup
  • Identificare padre e figlio
  • Controllare tipi dati
  • Trovare duplicati
  • Trovare record orfani
  • Correggere i dati
  • Creare la relazione
  • Test e manutenzione
  • FAQ

Perché una tabella piena richiede più attenzione

Quando crei due tabelle nuove, puoi definire subito chiavi e integrità prima di inserire record. Con tabelle già popolate, invece, Access deve verificare che tutti i dati rispettino il vincolo. Se Ordini.IDCliente contiene valori che non esistono in Clienti.IDCliente, l’integrità non può essere applicata senza correggere prima le righe incoerenti.

Questo comportamento è un vantaggio: evita di dichiarare “coerente” un database che contiene già riferimenti non validi.

Fase 1: crea un backup

Prima di modificare tipi, chiavi o relazioni crea una copia completa del file ACCDB. Se il database è condiviso, assicurati che nessun utente stia scrivendo nel back-end. Per modifiche strutturali importanti è consigliabile lavorare su una copia e applicare il piano al file operativo solo dopo i test.

Non usare l’unica copia del database come ambiente di prova. Una conversione di tipo o una query di aggiornamento possono modificare migliaia di righe.

Fase 2: identifica la cardinalità reale

Prima di scegliere i campi, definisci la relazione dal punto di vista del processo. Un cliente può avere molti ordini: Clienti è il lato uno, Ordini il lato molti. Un ordine contiene molti prodotti e un prodotto compare in molti ordini: serve una tabella ponte DettagliOrdine.

La cardinalità deriva dalle regole aziendali, non dal numero di righe che trovi oggi. Anche se ogni cliente nel campione ha un solo ordine, il modello resta uno-a-molti se in futuro può averne di più.

Fase 3: scegli la chiave primaria

Il campo sul lato uno deve essere una chiave primaria o avere un indice univoco se vuoi applicare l’integrità referenziale. Se la tabella non ha una chiave affidabile, considera di aggiungere un ID Autonumerazione. Evita nomi, email e descrizioni se possono cambiare o duplicarsi.

Una chiave tecnica introdotta in una tabella già piena richiede poi di popolare le corrispondenti chiavi esterne nelle tabelle figlie, spesso tramite vecchi codici di mapping.

Fase 4: controlla i tipi dati

Apri le tabelle in Visualizzazione Struttura. Se la primaria è Autonumerazione, la chiave esterna deve normalmente essere Numero con Dimensione campo Intero lungo. Se la primaria è Testo breve, usa un tipo testuale compatibile. Non basta che i valori “sembrino” uguali.

Quando i dati arrivano da Excel, codici numerici possono essere stati importati come testo. Controlla prima di convertire e identifica valori non numerici, spazi o celle vuote.

Fase 5: cerca duplicati sul lato uno

Se vuoi usare CodiceCliente come campo univoco, verifica:

SELECT CodiceCliente, Count(*) AS Quanti FROM Clienti GROUP BY CodiceCliente HAVING Count(*) > 1;

Ogni riga restituita è un problema da risolvere. Potrebbero essere clienti duplicati reali, codici riutilizzati o errori di importazione. Non cancellare automaticamente: confronta dati anagrafici e storico.

Come gestire i duplicati

Decidi quale record rappresenta l’entità corretta. Aggiorna le tabelle figlie affinché puntino al record che manterrai, quindi archivia o rimuovi il duplicato solo dopo una verifica. Se i due record rappresentano entità diverse, il codice che pensavi univoco non è una buona chiave.

In quel caso aggiungi un ID tecnico e conserva il codice come attributo non univoco oppure correggi la regola aziendale.

Fase 6: trova record orfani

Per Clienti e Ordini usa:

SELECT Ordini.IDOrdine, Ordini.IDCliente FROM Ordini LEFT JOIN Clienti ON Ordini.IDCliente = Clienti.IDCliente WHERE Clienti.IDCliente IS NULL;

Questa query trova ordini il cui cliente non esiste. La stessa tecnica funziona per DettagliOrdine→Prodotti, Ticket→Tecnici e altre relazioni.

Come correggere gli orfani

Ogni record va valutato. Se l’ID è sbagliato, sostituiscilo con quello corretto. Se il padre è stato cancellato per errore, ripristinalo. Se il record figlio è storico importato, valuta una strategia di archiviazione. Se è realmente inutile, eliminalo soltanto dopo backup e verifica.

Non creare un record padre “fittizio” per raccogliere tutti gli errori senza documentazione. Se il processo richiede un valore “Sconosciuto”, modellalo esplicitamente e usalo consapevolmente.

Fase 7: controlla valori Null

Una chiave esterna Null può essere valida se la relazione è opzionale. Per esempio, un ticket non ancora assegnato può avere IDTecnico Null. Se invece ogni ordine deve avere un cliente, i Null sono dati incompleti e vanno corretti.

SELECT IDOrdine FROM Ordini WHERE IDCliente IS NULL;

Dopo la pulizia puoi impostare Required/Sì sul campo se il requisito lo prevede.

Fase 8: crea la relazione

  1. Chiudi gli oggetti che usano le tabelle.
  2. Vai su Strumenti database > Relazioni.
  3. Aggiungi le tabelle.
  4. Trascina la chiave del padre sulla chiave esterna.
  5. Controlla i campi nella finestra Modifica relazioni.
  6. Seleziona Applica integrità referenziale.
  7. Valuta separatamente le opzioni a catena.
  8. Conferma e salva.

Se Access accetta il vincolo, hai superato i principali controlli strutturali e di coerenza richiesti per quella relazione.

Se Access rifiuta ancora l’integrità

Ricontrolla tipi e Dimensione campo. Verifica che il padre sia davvero univoco. Cerca orfani non individuati, inclusi spazi e valori testuali diversi. Controlla che le tabelle siano fisicamente nello stesso database Access quando vuoi gestire lì l’integrità.

Se sono tabelle collegate da un back-end Access, apri il back-end e crea la relazione nel file che contiene i dati. Se il back-end è SQL Server, definisci il vincolo nel server.

Importare dati in una nuova chiave tecnica

Supponiamo che Clienti sia identificata da CodiceCliente testuale e vuoi passare a IDCliente Autonumerazione. Aggiungi l’ID alla tabella Clienti. Nella tabella Ordini aggiungi un nuovo IDCliente Numero/Intero lungo. Usa una query di aggiornamento che abbini i vecchi CodiceCliente e scriva il nuovo ID.

Prima di eliminare la vecchia relazione, verifica che ogni ordine abbia il nuovo ID. Mantieni temporaneamente entrambi i campi per confrontare i risultati. Solo dopo il test dismetti il collegamento vecchio.

Esempio SQL di aggiornamento della nuova chiave

UPDATE Ordini INNER JOIN Clienti ON Ordini.CodiceCliente = Clienti.CodiceCliente SET Ordini.IDCliente = Clienti.IDCliente;

Esegui una SELECT equivalente prima dell’UPDATE e lavora su una copia. Dopo l’aggiornamento, cerca IDCliente Null e record non corrispondenti.

Non eliminare il vecchio campo troppo presto

Durante una migrazione il vecchio identificatore è il tuo ponte per ricostruire le corrispondenze. Se lo cancelli prima di aver validato il nuovo ID, potresti perdere la possibilità di capire da quale record proveniva una riga.

Conserva il campo finché query, maschere, report ed esportazioni non sono state aggiornate e testate.

Creare relazioni su dati importati da Excel

Importa inizialmente in tabelle di staging. Pulisci spazi, formati, date e codici. Deduplica le anagrafiche. Assegna ID. Poi accoda nelle tabelle definitive. Questo è più sicuro che importare direttamente in Clienti e Ordini con vincoli attivi.

La staging table permette di conservare il dato grezzo e confrontarlo con il risultato pulito.

Usare una query Trova non corrispondenti

Access include una procedura guidata per trovare record non corrispondenti. Puoi usarla al posto dell’SQL manuale per cercare figli senza padre. Seleziona la tabella figlia, il padre e i campi di confronto.

Conserva la query come strumento di controllo periodico, soprattutto se importi dati da sistemi esterni.

Controllare la cardinalità dopo la creazione

Con integrità referenziale in una relazione uno-a-molti dovresti vedere 1 sul padre e ∞ sul figlio. Se vedi uno-a-uno quando non te lo aspetti, controlla se la chiave esterna ha un indice univoco che impedisce duplicati.

Ordini.IDCliente deve poter ripetersi: un cliente può avere molti ordini.

Aggiornamento a catena

Attivalo solo se la chiave primaria può davvero cambiare. Con Autonumerazione normalmente non serve. Se una chiave naturale viene rinumerata, l’opzione può propagare il nuovo valore ai figli.

Una necessità frequente di rinumerare indica spesso che sarebbe meglio usare una chiave tecnica stabile.

Eliminazione a catena

Valuta con prudenza. Su dati storici come Clienti→Ordini spesso è meglio non attivarla. Su dati strettamente dipendenti, come un progetto di test e righe temporanee, può essere appropriata. La scelta dipende dal significato dei figli.

Testa sempre su una copia e documenta la decisione.

Relazioni e query esistenti

Le query possono contenere join salvati indipendentemente dalle relazioni. Dopo aver creato il nuovo vincolo, controlla le query esistenti per verificare che usino i campi corretti. Una query costruita anni prima può continuare a usare il vecchio CodiceCliente.

Usa Dipendenze oggetti e cerca riferimenti nel VBA.

Maschere e combo box

Se introduci nuovi ID, aggiorna le combo box. La combo deve mostrare RagioneSociale o Descrizione ma salvare l’ID tecnico nella Bound Column. Controlla anche Link Master Fields e Link Child Fields nelle sottomaschere.

Molti problemi dopo una migrazione derivano dall’interfaccia che continua a salvare il vecchio campo.

Report

I report basati su query possono funzionare senza modifiche se la query mantiene gli stessi alias, ma non darlo per scontato. Verifica filtri, raggruppamenti, ordinamenti e lookup. Genera alcuni report storici e confrontali con la versione precedente.

Un test di regressione dovrebbe coprire i principali output del database.

Database multiutente

In un ambiente condiviso esegui la pulizia e la modifica del back-end quando gli utenti sono disconnessi. Ogni utente dovrebbe avere un front-end locale. Dopo la modifica distribuisci una versione aggiornata del front-end se sono cambiati campi o query.

Con tabelle server, gestisci foreign key e vincoli sul server e usa Access come front-end.

Access Microsoft 365 e Access 2024

La procedura riguarda l’app desktop Access per Windows, inclusi Microsoft 365 e Access 2024. La scelta 32 o 64 bit non cambia chiavi e integrità. Access Runtime è per l’esecuzione, non per la progettazione completa della struttura.

Access desktop non è disponibile nativamente su macOS.

Prestazioni e indici

Dopo aver creato le relazioni, valuta indici sulle chiavi esterne usate frequentemente nei join. Le primarie sono già indicizzate. Non impostare un indice univoco sul lato molti se la chiave deve ripetersi.

Su grandi volumi, query di pulizia e aggiornamento vanno testate per tempo e impatto.

Compattazione e manutenzione

Dopo modifiche massive e quando appropriato, valuta Compatta e ripristina su una copia/backup. Non usare la compattazione come sostituto della progettazione, ma come parte della manutenzione del file Access.

Monitora la dimensione del database e pianifica backup regolari.

Documentare la migrazione

Annota struttura prima/dopo, query usate per il mapping, numero di record aggiornati, eccezioni e regole finali. Genera un Relationship Report. Questa documentazione è preziosa se in futuro devi capire perché un ID è stato introdotto o come sono state trattate le anomalie.

Conserva anche una copia del database precedente per il periodo di verifica previsto.

Errori comuni

Creare subito la relazione senza analizzare i dati; cancellare orfani senza valutarne il significato; convertire tipi senza backup; eliminare il vecchio identificatore troppo presto; usare un record fittizio per nascondere errori; attivare cascata automaticamente; modificare il front-end invece del back-end.

Una procedura ordinata evita quasi tutti questi problemi.

Test finale

Inserisci un nuovo padre e un figlio valido. Prova un figlio con chiave inesistente: Access deve bloccarlo. Prova cancellazione e modifica del padre secondo le regole configurate. Esegui query di non corrispondenza: non dovrebbero restituire righe inattese.

Apri maschere, report ed esportazioni e confronta i risultati con quelli precedenti.

FAQ

Posso creare una relazione se le tabelle hanno già migliaia di righe?

Sì, se i dati rispettano il vincolo.

Devo cancellare i record orfani?

Non necessariamente: devi capire la causa e scegliere la correzione appropriata.

Perché Access rifiuta l’integrità?

Tipi incompatibili, padre non univoco, orfani o tabelle nel posto sbagliato sono le cause principali.

Posso aggiungere una chiave Autonumerazione a dati esistenti?

Sì, ma devi poi mappare correttamente le chiavi esterne nelle tabelle figlie.

È meglio fare tutto nel file di produzione?

No. Testa prima su una copia.

Link utili

Consulta la categoria Guide Access, creare relazioni, integrità referenziale, chiavi primarie ed esterne e diagnosticare relazioni progettate male.

Fonti Microsoft: creare e modificare relazioni, guida alle relazioni.

Conclusione

Creare relazioni tra tabelle già piene di dati in Access è sicuro se prima controlli chiavi, tipi, duplicati e record orfani. Pulisci i dati, applica l’integrità solo quando il database è coerente e verifica tutti gli oggetti dipendenti. La preparazione richiede più tempo del trascinamento della linea, ma evita errori che altrimenti emergerebbero molto più tardi.

Lascia un commento