Pregunta SQL UPDATE orden de evaluación


Cuál es el orden de evaluación en la siguiente consulta:

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

Es decir, "tbl"."p" establecerse en q o q + 1? ¿El orden de la evaluación se rige por el estándar SQL?

Gracias.

ACTUALIZAR

Después de considerar La respuesta de Migs, Realicé algunas pruebas en todos los DB que pude encontrar. Si bien no sé lo que dice el estándar, las implementaciones varían.

Dado

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;

Encontré los valores de "p" y "q" fueron:

database           p   q
-----------------+---+---
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

ACTUALIZACIÓN 2

Firebird 2.5 cambia su comportamiento para que coincida con la mayoría de los otros motores SQL que probé, dejando a MySQL solo. La entrada relevante de Notas de versión, "Cambio de lógica en la cláusula SET", sugiere fuertemente que el comportamiento de la mayoría es correcto según las especificaciones de SQL.

He molestado a MySQL para comentar sobre este comportamiento (error no. 52861), ya que parecen ser el valor atípico.

ACTUALIZACIÓN 3

El error antes mencionado es hoy (2010-05-19) cerrado, y la documentación configurada para actualizarse para que este comportamiento sea explícito tanto en el ACTUALIZAR descripción y en el Diferencias de SQL estándar sección.

Bravo, MySQL.


32
2018-02-04 21:03


origen


Respuestas:


MySQL hace una evaluación de "izquierda a derecha" y "ve" los nuevos valores. (Probado en 5.0.45-community-nt-log MySQL Community Edition)

Además, del manual de MySQL: "Las asignaciones de ACTUALIZACIÓN de tabla única generalmente se evalúan de izquierda a derecha. Para las actualizaciones de tabla múltiple, no hay garantía de que las asignaciones se lleven a cabo en un orden en particular".

Ahora, "en general" es bastante vago y "no hay garantía" es muy malo, dado que el orden de evaluación es importante.

Entonces, para responder la pregunta: ¿ES el comportamiento especificado por "el estándar SQL" o es solo una convención?


ACTUALIZACIÓN: Obtuvo las especificaciones de SQL92 que indican en "13.10 declaración de actualización: buscado" elemento "6) Las (expresiones de valor) se evalúan efectivamente para cada fila de T antes de actualizar cualquier fila de T."

En mi humilde opinión no es absolutamente inequívoco, pero lo suficiente como para considerar que el ESTÁNDAR NO es "ver" los resultados de su propia actualización. Teniendo en cuenta su ejemplo, la forma en que Oracle, PostgreSQL e Interbase lo hacen.


13
2018-04-13 20:06



los UPDATE no ve los resultados de su trabajo.

p se establecerá en q a partir de la actualización anterior.

El siguiente código solo cambiará las columnas:

DECLARE @test TABLE (p INT, q INT)

INSERT
INTO    @test
VALUES  (2, 3)

SELECT  *
FROM    @test

p    q
---  ---
  2    3

UPDATE  @test
SET     p = q,
        q = p

SELECT  *
FROM    @test

p    q
---  ---
  3    2

5
2018-02-04 21:07



La escritura en la tabla tiene que ocurrir después de la transacción que estaba en curso cuando se completó la lectura.


-1
2018-02-04 21:05