2012-03-29 15 views
5

So che la domanda su come aggiornare più tabelle in SQL è stata già chiesta e la risposta comune sembra essere fatta separatamente in una transazione.Come aggiornare 2 colonne in 2 tabelle che hanno una chiave esterna

Tuttavia, le 2 colonne che devo aggiornare hanno una chiave esterna quindi non possono essere aggiornate separatamente.

ad es.

Table1.a è una chiave esterna per Table2.a

Una delle voci nelle tabelle è sbagliato, per esempio entrambe le colonne sono 'xxx' e dovrebbero essere 'yyy'

Come aggiornare Table1.a e Table2.a in modo che sia 'yyy'?

So che avrei potuto rimuovere la chiave e sostituire ma sicuramente c'è un altro modo.

Grazie

risposta

10

Non si può fare l'aggiornamento allo stesso tempo, ma è possibile forzare SQL per fare l'aggiornamento. È necessario assicurarsi che le proprie chiavi esterne abbiano l'azione di attivazione referenziale ON UPDATE CASCADE

ad es.

ALTER TABLE YourTable 
ADD CONSTRAINT FK_YourForeignKey 
FOREIGN KEY (YourForeignKeyColumn) 
REFERENCES YourPrimaryTable (YourPrimaryKeyColumn) ON UPDATE CASCADE 
+0

Grazie, questo chiarisce che non posso. Cascade funziona bene. – Sunrise

+0

+1 anche da parte mia! –

2

la mia risposta si basa sul seguente link: http://msdn.microsoft.com/en-us/library/ms174123%28v=SQL.90%29.aspx

È necessario assicurarsi che il vostro table_constraint sarà definito come ON UPDATE CASCADE

  CREATE TABLE works_on1 
     (emp_no INTEGER NOT NULL, 
      project_no CHAR(4) NOT NULL, 
      job CHAR (15) NULL, 
      enter_date DATETIME NULL, 
      CONSTRAINT prim_works1 PRIMARY KEY(emp_no, project_no), 
      CONSTRAINT foreign1_works1 FOREIGN KEY(emp_no) REFERENCES employee(emp_no) ON DELETE CASCADE, 
      CONSTRAINT foreign2_works1 FOREIGN KEY(project_no) REFERENCES project(project_no) ON UPDATE CASCADE) 

e poi quando si cambierà il valore di la vostra chiave primaria

vedere la seguente offerta:

Per ON DELETE o ON UPDATE, se l'opzione CASCADE è specificata, la riga viene aggiornata nella tabella di riferimento se la riga di riferimento corrispondente viene aggiornata nella tabella padre. Se NO ACTION è specificato in , SQL Server Compact Edition restituisce un errore e viene eseguito il rollback dell'azione di aggiornamento nella riga di riferimento della tabella padre.

Ad esempio, è possibile avere due tabelle, A e B, in un database. Tabella A ha una relazione referenziale con la tabella B: la chiave A.ItemID estranea fa riferimento alla chiave primaria B.ItemID.

Se un'istruzione UPDATE viene eseguita su una riga nella tabella B e un ON UPDATE CASCADE azione è specificato per A.ItemID, SQL Server Compact Edition controlli per una o più righe dipendenti nella tabella A. Se uno qualsiasi esiste , le righe dipendenti nella tabella a sono aggiornati, così come la fila riferimento nella tabella B.

in alternativa, se viene specificato NO ACTION, SQL Server Compact Edition restituisce un errore e ripristina l'azione di aggiornamento sul riferimento riga nella tabella B quando è presente almeno una riga nella tabella A a cui fa riferimento .

+0

Grazie, l'aggiornamento a cascata funziona correttamente. – Sunrise

2

Non essendo un fan di aggiornamento in cascata, vorrei suggerire un percorso diverso.

Prima di non aggiornare la tabella padre, si aggiunge un nuovo record con il valore desiderato (e gli stessi dati dell'altro record per tutti gli altri campi). Quindi non hai difficoltà ad aggiornare le tabelle figlio per utilizzare questo valore al posto di quel valore. Inoltre ora hai la possibilità di eseguire il lavoro in gruppo per evitare di bloccare il sistema mentre il cambiamento si diffonde attraverso di esso. Una volta aggiornate tutte le tabelle figlio, è possibile eliminare il record non valido originale.

+0

Grazie per la tua risposta che suona bene, tranne che ho bisogno di mantenere gli stessi campi di identità e ci sono anche indici unici su altre 4 colonne che restringerebbero la loro duplicazione richiesta per il tuo metodo. – Sunrise

Problemi correlati