2013-04-02 7 views
5

Ho cercato queste informazioni sia su SO che su google, ma non ho trovato alcuna risposta autorevole.SQL UPDATE leggere i valori delle colonne prima dell'impostazione

Quando si dispone di un'istruzione di aggiornamento come:

UPDATE table SET rowA = rowB, rowB = NULL ... 

Sembra che:

  • ordinamento non è importante (UPDATE table SET rowB = NULL, rowA = rowB)
  • comunque, il risultato è che rigaA assume il valore prev nella riga B, poiché sembra che UPDATE prima abbia letto i valori precedenti, quindi li aggiorna.

Vorrei sapere se i due punti di cui sopra sono vero in generale per SQL, vale a dire se sono parte della semantica SQL UPDATE, se sono nel standard di, o se è un dettaglio di implementazione (e quindi soggetto a modifiche). Grazie!

EDIT: Vorrei sottolineare che vorrei una risposta "autorevole"; Ho già testato su una serie di implementazioni SQL che il comportamento è effettivamente quello illustrato qui. Quello di cui ho bisogno è una "prova" che questo sia effettivamente nello standard SQL/spec/semantica di UPDATE, con un collegamento allo standard o, in alternativa, a una fonte affidabile surrogata (MSDN, dev.mysql.com, Oracle o PostgreSQL documenti, ...)

risposta

4

James R. Groff, Paul N. Weinberg: SQL The complete reference (Osborne 1999), pagina 209 stati

citazione inizio

Se un'espressione nella lista di assegnazione fa riferimento a una delle colonne della tabella di destinazione, il valore utilizzato per calcolare l'espressione è la valore di quella colonna nella riga corrente prima che vengano applicati gli aggiornamenti. Lo stesso vale per i riferimenti di colonna che si verificano nella clausola WHERE .Ad esempio, si consideri questo (un po 'forzata) UPDATE:

UPDATE OFFICES 
SET QUOTA = 400000.00, SALES = QUOTA 
WHERE QUOTA < 400000.00 

Prima dell'aggiornamento, Bill Adams aveva un valore QUOTA di $ 350.000 e un valore di SALES $ 367 mila novecentoundici. Dopo l'aggiornamento, la sua riga ha un valore di SALES di $ 350.000, non $ 400.000. L'ordine delle assegnazioni nella clausola SET è quindi irrilevante; gli incarichi possono essere specificati in qualsiasi ordine.

fine citazione

Lo stesso è supportato da capitolo 13.9 punto 6, pagina 393, di un progetto per l'ANSI-92 SQL standard (X3H2-93-004), trovato here.

Questo è il più indipendente implementazione e il più vicino possibile ottenere così lontano.

Altre fonti di X3H2-93-004 possono essere trovate ad es. here (pg 590, elemento 15)

+0

Esattamente quello che stavo cercando! Grazie! –

1

Questo è un comportamento standard. Quando fai riferimento a una riga, fai riferimento alla versione pre-aggiornamento.

In SQL Server le due versioni di riga può essere visualizzato con la output clausola

update YourTable 
set  col1 = col1 + 1 
output deleted.col1 -- Pre-update version of row 
,  inserted.col1 -- Post-update version of row 
+0

Grazie. Hai qualche link allo standard? (o ad un "surrogato", fonte ufficiale (MSDN, dev.mysql, ...) che lo menziona come comportamento standard?) Non sono riuscito a trovarne! –