2010-04-19 15 views
5

Ho una tabella delle categorie, che uno dei campi serve come chiave esterna per una tabella delle sottocategorie. Un campo che fa parte della chiave primaria per ogni tabella è l'id della lingua. Devo aggiornarli in entrambe le tabelle. Fondamentalmente, ovunque la lingua id = x in entrambe le tabelle, ho bisogno di impostarlo su y.SQL aggiorna una tabella con una chiave esterna

Quando provo a eseguire un aggiornamento su entrambe le tabelle, viene visualizzato un messaggio 'L'istruzione UPDATE è in conflitto con il vincolo REFERENCE ..' che fa riferimento al vincolo di chiave esterna.

Come posso aggiornare il campo della lingua su entrambe queste tabelle?

+0

Sembra che il tuo 'y' non esista nella tabella di riferimento (chiave esterna). Devi prima aggiungerlo. – Oded

+1

SQL Server? MySQL? Oracolo? E hai FK circolare? – gbn

risposta

9

Se si sta eseguendo una correzione a 1 ora, rilasciare il vincolo, AGGIORNA, quindi aggiungere nuovamente il vincolo.

Se è necessario eseguire questa operazione come parte dell'applicazione, inserire una riga di categoria, aggiornare la riga delle sottocategorie e quindi eliminare la riga della categoria originale.

5

È necessario eliminare i vincoli, aggiornare i valori e quindi aggiungere nuovamente i vincoli.

+0

OP non dice se questa è una volta o parte della logica aziendale. Questo metodo è valido per le conversioni una tantum, ma non per le transazioni basate su applicazioni. –

2

È necessario disabilitare prima i vincoli, eseguire l'aggiornamento e quindi riattivare i vincoli.

Controlla questo article di OdeToCode discutendo di questo.

2

È possibile modificare il vincolo in ON UPDATE CASCADE.

+0

+1 che è quello che ho pensato anche io ... a meno che il motore DB non supporti questo – gbn

2

Sono sempre sospettoso sulla disabilitazione dei vincoli, e voi in realtà non voglio farlo se questa è un'operazione comune.

Un certamente brutto alternativa è quella di: - creare una riga nella tabella padre, basato sulla riga da aggiornare, ma che contiene il nuovo valore di chiave esterna - Aggiornare tutte le righe figlio in cui la chiave esterna contiene il vecchio valore con il nuovo valore - Elimina la riga genitore ora inutilizzata riga

Ciò è scomodo per qualsiasi numero di ovvi motivi e potrebbe non essere adatto all'implementazione, ma mantiene l'integrità referenziale all'interno del database.

Problemi correlati