Ordine di valutazione SQL UPDATE

Qual è l’ordine di valutazione nella seguente query:

UPDATE tbl SET q = q + 1, p = q; 

Cioè, "tbl"."p" essere impostato su q o q + 1 ? L’ordine di valutazione è disciplinato dallo standard SQL?

Grazie.

AGGIORNARE

Dopo aver considerato la risposta di Migs , ho eseguito alcuni test su tutti i DB che ho trovato. Mentre non so cosa dice lo standard, le implementazioni variano.

Dato

 CREATE TABLE tbl (p INT NOT NULL, q INT NOT NULL); INSERT INTO tbl VALUES (1, 5); -- p := 1, q := 5 UPDATE tbl SET q = q + 1, p = q; 

Ho trovato i valori di "p" e "q" :

 database pq -----------------+---+--- Firebird 2.1.3 | 6 | 6 -- But see "Update 2" below InterBase 2009 | 5 | 6 MySQL 5.0.77 | 6 | 6 -- See "Update 3" below Oracle XE (10g) | 5 | 6 PostgreSQL 8.4.2 | 5 | 6 SQLite 3.3.6 | 5 | 6 SQL Server 2016 | 5 | 6 

AGGIORNAMENTO 2

Firebird 2.5 modifica il suo comportamento in modo che corrisponda alla maggior parte degli altri motori SQL che ho testato, lasciando solo MySQL. La voce relativa alle note sulla versione, “Modifica logica nella clausola SET” , suggerisce fortemente che il comportamento di maggioranza è corretto in base alle specifiche SQL .

Ho confidato a MySQL di commentare questo comportamento (bug n. 52861 ), in quanto sembrano essere i precedenti.

AGGIORNAMENTO 3

Il bug di cui sopra è oggi (2010-05-19) chiuso e la documentazione impostata per essere aggiornata per rendere esplicito questo comportamento sia nella descrizione UPDATE che nella sezione Differenze da SQL standard .

Bravo, MySQL.

MySQL esegue una valutazione “da sinistra a destra” e “vede” i nuovi valori. (Testato su 5.0.45-community-nt-log MySQL Community Edition)

Inoltre, dal manuale MySQL: “Gli assegnamenti UPDATE a tabella singola vengono generalmente valutati da sinistra a destra, per gli aggiornamenti a più tabelle, non vi è alcuna garanzia che gli incarichi vengano eseguiti in un ordine particolare.”

Ora, “generalmente” è piuttosto vago e “nessuna garanzia” è molto brutta, dato che l’ordine di valutazione è importante.

Quindi, al fine di rispondere alla domanda: il comportamento è specificato da “lo standard SQL” o è solo una convenzione?


AGGIORNAMENTO: ho ottenuto le specifiche SQL92 che dichiarano in “13.10 update statement: cercato” item “6) Le (value expression) s sono effettivamente valutate per ogni riga di T prima di aggiornare qualsiasi riga di T.”

IMHO non è assolutamente univoco, ma abbastanza da considerare che lo STANDARD NON è “vedere” i risultati del proprio aggiornamento. Considerando il tuo esempio, il modo in cui fanno Oracle, PostgreSQL e Interbase.

L’ UPDATE non vede i risultati del suo lavoro.

p sarà impostato su q prima dell’aggiornamento.

Il seguente codice sostituirà semplicemente le colonne:

 DECLARE @test TABLE (p INT, q INT) INSERT INTO @test VALUES (2, 3) SELECT * FROM @test pq --- --- 2 3 UPDATE @test SET p = q, q = p SELECT * FROM @test pq --- --- 3 2 

La scrittura sulla tabella deve avvenire dopo la transazione che era a buon punto quando la lettura è stata completata.