2013-02-12 12 views
5

Sto utilizzando un database MySQL. Nel mio modello di dati relazionali, ho due entità che si riferiscono 1: 1 l'una all'altra. Nel mio schema, viene impostata una relazione 1: 1 inserendo un campo FK in una delle due tabelle, che si riferisce al PK dell'altra tabella. Entrambe le tabelle hanno PK e sono entrambi BIGINT di incremento automatico.Vincolo di chiave esterna a due vie in una relazione 1: 1

Mi chiedo se sia possibile avere un comportamento ON DELETE CASCADE su di essi che funziona in entrambe le direzioni.

, ad esempio 1: 1 B, significa che [la cancellazione di A elimina anche B] e [l'eliminazione di B cancella anche A].

Mi rendo conto che questo potrebbe non essere assolutamente necessario in termini di corretta progettazione dell'applicazione, ma mi chiedo solo se sia effettivamente possibile. Per quanto ricordo, non puoi mettere un vincolo FK su un PK.

risposta

8

Sarebbe impossibile inserire tali record se è stata applicata una relazione a 2 vie. Pollo e uova. Il record nella tabella n. 1 non può essere inserito perché non c'è alcun record corrispondente nella tabella n. 2 e la tabella n. 2 non può essere inserita perché non c'è nulla nella tabella n. 1 a cui collegarsi.

È possibile disattivare temporaneamente i vincoli FK (set foreign_key_checks = 0), ma questo non dovrebbe mai essere eseguito in un sistema "reale". È destinato più per il caricamento di discariche in cui l'ordine di caricamento della tabella non può essere garantito.

+0

+1 per l'argomento 'pollo o uovo'. ;-D – SparKot

+1

@DoSparKot: la mia solita risposta per "cosa è venuto prima?" la domanda è "il gallo": p –

+0

Hmm, questo è un punto valido a cui non ho pensato. Inoltre, solo il pensiero di avere un vincolo non riesce sull'inserto, poiché il valore di un campo auto-incrementato mi sta già facendo venire la nausea. (P.S. Il gallo è un maschio.Non è una lotta leale.) –

Problemi correlati