복붙노트

[SQL] 평가의 SQL UPDATE 순서

SQL

평가의 SQL UPDATE 순서

다음 쿼리의 평가 순서는 무엇입니까 :

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

즉, "TBL". "P"q 또는 Q + 1로 설정됩니다? 평가의 순서는 여기에 SQL 표준이 적용되어 있습니까?

감사.

MIGS '대답을 고려하면, 내가 찾을 수있는 모든 DB를 몇 가지 테스트를 실행. 나는 표준의 말씀 모르겠지만, 구현은 다양합니다.

주어진

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;

나는 "P"와 "Q"의 값을 찾았습니다

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

파이어 버드 2.5 혼자 MySQL을 떠나, 내가 테스트를 다른 SQL 엔진의 대부분을 맞게 동작을 변경합니다. 관련 릴리스 정보 항목, "SET 절에 로직 변경", 강하게 대부분의 동작은 SQL 사양에 따라 정확하다는 것을 시사한다.

그들은 특이 것 같다 나는이 문제 (버그 번호. 52861)에 대한 언급을 MySQL의를 도청했다.

상기의 버그가 오늘 (2010-05-19) 폐쇄, 그리고 설명서 세트는 UPDATE 기술 및 표준 SQL 섹션에서 차이에서 모두이 동작을 명시하도록 업데이트 할 수 있습니다.

브라보, MySQL은.

해결법

  1. ==============================

    1.MySQL은 평가 "왼쪽에서 오른쪽으로"않으며 새 값 "을 참조하십시오"않습니다. (5.0.45 - 커뮤니티 - NT-로그의 MySQL 커뮤니티 에디션에서 테스트)

    MySQL은 평가 "왼쪽에서 오른쪽으로"않으며 새 값 "을 참조하십시오"않습니다. (5.0.45 - 커뮤니티 - NT-로그의 MySQL 커뮤니티 에디션에서 테스트)

    또한, MySQL의 설명서에서 ". 단일 테이블 UPDATE 할당 일반적으로 왼쪽에서 오른쪽으로 평가됩니다 여러 테이블 업데이트의 할당은 특정 순서로 수행되는 것을 보장 할 수 없습니다."

    이제, "일반적으로"매우 모호하고 "보장"는 아주 나쁜 평가의 순서가 중요하다는 점을 부여하지 않습니다.

    그래서, 질문에 대답하기 위해 "SQL 표준"에 의해 지정된 동작은 아니면 그냥 컨벤션입니까?

    업데이트 :에있는 상태 SQL92 사양의있어 홀드 : "S 효과적으로 T.의 행을 업데이트하기 전에 T의 각 행에 대해 평가 6) (값 표현)"항목을 "13.10 업데이트 문은 검색"

    절대적으로 모호하지만 충분하지 이럴 표준 자신 업데이트의 결과 "를 참조하십시오"로이 아닌 것을 고려합니다. 귀하의 예를 고려, 방법 오라클, PostgreSQL을하고 인터베이스 그것을 할.

  2. ==============================

    2.이 업데이트는 그 일의 결과가 표시되지 않습니다.

    이 업데이트는 그 일의 결과가 표시되지 않습니다.

    페이지가 갱신 이전의로 Q로 설정됩니다.

    다음 코드는 열을 교환합니다 :

    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
    
  3. ==============================

    3.테이블에 쓰기는 읽기가 완료 될 때 진행도 있었다 거래 후 발생한다.

    테이블에 쓰기는 읽기가 완료 될 때 진행도 있었다 거래 후 발생한다.

  4. from https://stackoverflow.com/questions/2203202/sql-update-order-of-evaluation by cc-by-sa and MIT license