Gli errori di integrità referenziale in Access indicano che un’operazione creerebbe o lascerebbe un collegamento non valido tra tabelle. Le cause più comuni sono chiavi esterne senza record padre, cancellazioni che lascerebbero record orfani, modifiche della chiave primaria non propagate, tipi dati incompatibili o duplicati sul lato che dovrebbe essere univoco. La soluzione corretta non è disattivare il vincolo, ma identificare la causa e correggere struttura o dati.
Indice
- Che cos’è l’integrità referenziale
- Errori più comuni
- Record orfani
- Tipi dati
- Duplicati e chiavi
- Cancellazioni e aggiornamenti
- Query SQL di diagnosi
- Database multiutente
- FAQ
Che cos’è l’integrità referenziale
In un database relazionale una chiave esterna deve riferirsi a un record valido della tabella padre. Se Ordini.IDCliente contiene 25, deve esistere Clienti.IDCliente=25. L’integrità referenziale è la regola con cui Access impedisce di creare riferimenti a record inesistenti e mantiene sincronizzate le relazioni.
Quando il vincolo è attivo, Access blocca anche la cancellazione del padre se esistono figli e impedisce di cambiare la chiave primaria lasciando figli collegati al vecchio valore. Le opzioni a catena possono modificare questo comportamento in modo controllato.
Errore 1: chiave esterna senza record padre
È il classico record orfano. Un ordine contiene IDCliente=999 ma il cliente 999 non esiste. Può accadere dopo importazioni da Excel, cancellazioni eseguite quando il vincolo non era attivo o inserimenti manuali.
Trova questi record con una query di non corrispondenza:
SELECT Ordini.IDOrdine, Ordini.IDCliente FROM Ordini LEFT JOIN Clienti ON Ordini.IDCliente = Clienti.IDCliente WHERE Clienti.IDCliente IS NULL;
Per ogni riga devi decidere se correggere l’ID, ripristinare il record padre, archiviare il figlio o eliminarlo solo se non ha valore.
Errore 2: cancellazione del record padre bloccata
Se provi a eliminare un cliente con ordini e Access rifiuta l’operazione, l’integrità sta facendo il proprio lavoro. La domanda è cosa deve succedere agli ordini. Se devono restare per storico, non cancellare il cliente: rendilo inattivo. Se i figli sono dati temporanei che devono scomparire con il padre, valuta l’eliminazione a catena.
Non eliminare la relazione per aggirare il messaggio. Rimuovendo il vincolo renderesti possibile creare record orfani.
Errore 3: modifica della chiave primaria bloccata
Se una chiave naturale può cambiare e ha record figli, Access impedisce la modifica finché il vecchio valore è referenziato. Puoi attivare Aggiorna campi correlati a catena, purché l’integrità sia attiva e la modifica della chiave abbia davvero senso.
Con una chiave Autonumerazione normalmente non hai questo problema perché il valore è stabile e non si modifica. Se una chiave aziendale cambia spesso, considera un ID tecnico Autonumerazione e conserva il codice come attributo separato.
Errore 4: tipi di dati incompatibili
Per applicare l’integrità, i campi collegati devono essere compatibili. La combinazione comune è Autonumerazione sul lato padre e Numero/Intero lungo sul lato figlio. Un campo Testo breve che contiene cifre non è equivalente a Numero.
Apri entrambe le tabelle in Struttura e controlla Tipo dati e Dimensione campo. Prima di convertire crea un backup e verifica i valori che non possono essere convertiti.
Errore 5: il lato uno contiene duplicati
Il campo padre deve essere chiave primaria o avere un indice univoco. Se usi CodiceCliente come lato uno ma esistono due clienti con lo stesso codice, Access non può garantire a quale record debba riferirsi il figlio.
Trova duplicati con:
SELECT CodiceCliente, Count(*) AS Quanti FROM Clienti GROUP BY CodiceCliente HAVING Count(*) > 1;
Correggi i duplicati o scegli una chiave diversa.
Errore 6: chiave esterna configurata come Autonumerazione
Una chiave esterna non deve generare un nuovo ID indipendente. Se Clienti.IDCliente è Autonumerazione, Ordini.IDCliente deve ricevere il valore del cliente e quindi va configurato come Numero/Intero lungo. Impostarlo Autonumerazione produce identificatori propri che non rappresentano il cliente.
Questa confusione è comune nei primi database Access e può impedire una relazione corretta.
Errore 7: molti-a-molti senza tabella ponte
Ordini e Prodotti sono molti-a-molti: un ordine contiene molti prodotti e un prodotto appare in molti ordini. Non tentare di risolvere tutto con una singola relazione diretta. Crea DettagliOrdine con IDOrdine e IDProdotto come chiavi esterne e due relazioni uno-a-molti.
La tabella ponte può contenere anche Quantità, PrezzoUnitario, Sconto e altre proprietà della riga.
Errore 8: tabelle collegate
Se lavori con front-end e back-end, l’integrità tra tabelle Access va definita nel file che contiene fisicamente le tabelle. Se il back-end è SQL Server, i vincoli devono essere gestiti nel database server. Una relazione disegnata nel front-end non sostituisce la protezione del sistema sorgente.
Apri il back-end in manutenzione, crea un backup e configura lì le relazioni.
Procedura di diagnosi completa
- Crea backup.
- Identifica la relazione che genera l’errore.
- Controlla chiave primaria e indice univoco.
- Controlla tipo e dimensione dei campi.
- Cerca duplicati sul lato uno.
- Cerca record orfani sul lato molti.
- Verifica eventuali Null.
- Chiudi gli oggetti in uso.
- Correggi i dati.
- Riattiva o modifica la relazione.
- Testa inserimenti, modifiche e cancellazioni.
Null nelle chiavi esterne
Un valore Null nella chiave esterna può essere ammesso se la relazione è opzionale. Per esempio, un Ticket potrebbe non avere ancora un Tecnico assegnato. Se invece ogni ordine deve avere un cliente, rendi il campo obbligatorio e usa una maschera che impedisca salvataggi incompleti.
Non usare 0 o stringhe vuote per simulare un’assenza se il modello prevede Null. Valori fittizi possono creare confusione nelle query.
Query per controllare Null
SELECT IDOrdine FROM Ordini WHERE IDCliente IS NULL;
Questa query individua ordini senza cliente. Se la regola aziendale li vieta, correggi i record e imposta il campo Required/Sì in struttura.
Importazioni da Excel
I problemi di integrità emergono spesso dopo importazioni. Excel può contenere ID come testo, righe duplicate, celle vuote, spazi e codici modificati. Prima di importare in tabelle operative usa tabelle di staging: importa i dati grezzi, valida, poi accoda nelle tabelle relazionali.
Con una query di accodamento puoi controllare quali righe entrano e intercettare errori prima di contaminare il database principale.
Integrità e query di aggiornamento
Una query UPDATE può essere bloccata se tenta di scrivere chiavi esterne inesistenti. Prima esegui una SELECT con gli stessi criteri e verifica i valori. Se devi cambiare una chiave primaria modificabile, valuta l’aggiornamento a catena anziché aggiornare manualmente decine di tabelle.
Non disattivare l’integrità soltanto per far completare una query: correggi l’ordine delle operazioni.
Integrità e query di eliminazione
Microsoft segnala che una query DELETE può eliminare record correlati quando è attiva l’eliminazione a catena. È quindi essenziale verificare in anteprima i criteri. Le cancellazioni massive non sono operazioni da provare direttamente sul file di produzione.
Conserva backup e testa su una copia realistica.
Relazioni e join
Una relazione persistente può applicare integrità; un join in query stabilisce come combinare record. Se una query restituisce duplicati o dati mancanti, non dare per scontato che l’integrità sia il problema. Controlla anche il tipo di join e la cardinalità.
INNER JOIN mostra corrispondenze; LEFT JOIN mantiene tutti i record della tabella sinistra. Le query di non corrispondenza usano spesso LEFT JOIN + IS NULL.
Cardinalità
Uno-a-molti richiede unicità sul lato uno e ripetizione consentita sul lato molti. Uno-a-uno richiede unicità su entrambi. Molti-a-molti richiede tabella ponte. Errori di cardinalità portano spesso a duplicati o impossibilità di applicare integrità.
Il modello deve riflettere le regole reali del dominio.
Database multiutente
Se più persone usano Access, separa front-end e back-end. Effettua modifiche strutturali quando nessuno usa le tabelle. Distribuisci un front-end locale per ogni utente e mantieni le relazioni nel back-end.
Una rete instabile può causare altri problemi di corruzione, ma non modifica le regole dell’integrità.
Access Microsoft 365 e Access 2024
La gestione delle relazioni è disponibile nell’app desktop Access per Microsoft 365 e Access 2024, oltre alle versioni indicate dalla documentazione Microsoft. La scelta 32 o 64 bit non cambia le regole relazionali; incide su compatibilità con driver, API e componenti.
Access Runtime è pensato per l’esecuzione delle applicazioni e non per la progettazione completa del modello. Access desktop non è disponibile nativamente su macOS.
Usare le dipendenze oggetti
Prima di cambiare una chiave o eliminare un campo usa Dipendenze oggetti per vedere query, maschere e report che lo utilizzano. Una correzione dell’integrità può richiedere modifiche anche all’interfaccia o al VBA.
Testa sempre il percorso completo dell’utente dopo una modifica strutturale.
Indici e prestazioni
Le chiavi primarie sono indicizzate; le chiavi esterne usate nei join possono beneficiare di un indice. L’indice non sostituisce l’integrità, ma può migliorare le prestazioni. Non impostare un indice univoco sulla chiave esterna di una relazione uno-a-molti, perché impedirebbe più figli per lo stesso padre.
Se il database cresce molto, valuta un back-end server mantenendo lo stesso modello logico.
Come correggere dati storici
Non eliminare automaticamente record orfani senza comprenderne il significato. Un ordine senza cliente potrebbe essere un dato storico importato. Potresti dover ricostruire il cliente, associare un record corretto o archiviarlo in una tabella separata. Documenta le decisioni.
La pulizia dei dati è parte della progettazione, non un’operazione puramente tecnica.
Soft delete
Per entità con storico, usa campi Attivo, DataCessazione o Stato anziché cancellare il padre. In questo modo l’integrità resta valida e le transazioni conservano il riferimento. Le query operative possono filtrare i record inattivi.
È spesso preferibile alla cancellazione a catena per clienti, fornitori e prodotti usati in documenti storici.
Test finale
Dopo la correzione prova a inserire un figlio con ID inesistente: Access deve bloccarlo. Inserisci poi un figlio valido. Prova a cancellare il padre e verifica il comportamento previsto. Se esistono opzioni a catena, testale su una copia.
Apri query, maschere e report per assicurarti che tutto continui a funzionare.
Errori da evitare
Non rimuovere il vincolo per “far funzionare” un import. Non cambiare tipi senza backup. Non usare descrizioni come chiavi. Non ignorare duplicati. Non creare chiavi esterne Autonumerazione. Non attivare la cancellazione a catena su dati storici senza analisi.
La soluzione robusta è correggere la causa, non silenziare l’errore.
FAQ
Che cos’è un record orfano?
Un record figlio la cui chiave esterna non corrisponde a nessun record padre.
Perché Access blocca una cancellazione?
Perché produrrebbe figli orfani, salvo eliminazione a catena.
Posso disattivare l’integrità?
Sì tecnicamente, ma non è una buona soluzione permanente ai dati incoerenti.
Autonumerazione e Numero sono compatibili?
Sì, normalmente con Numero/Intero lungo sul figlio.
Come trovo gli errori prima di attivare il vincolo?
Usa query di non corrispondenza, duplicati e controllo Null.
Link utili
Consulta la categoria Guide Access, integrità referenziale, relazioni e problemi nella creazione delle relazioni.
Fonti Microsoft: creare e modificare relazioni, guida alle relazioni.
Conclusione
Per risolvere gli errori di integrità referenziale in Access devi trovare quale regola viene violata e correggere dati o struttura. Record orfani, tipi incompatibili, duplicati e chiavi sbagliate sono le cause principali. Mantieni il vincolo come protezione del database e usa query di diagnosi, backup e test per intervenire in sicurezza.