2013-02-20 4 views
4

아주 간단한 질문이지만 대답을 찾을 수 없습니다.UPDATE 문은 모든 값을 동시에 (동시에) 설정합니까?

내가 정수 0에서 현재 둘 다 열 foobar, 테이블 var 있다고 가정 해 봅시다.

나는 실행하는 경우 :

UPDATE var SET foo=foo+1, bar=foo+1

그런 다음 무슨 일이 bar의 값이됩니다? 1 또는 2?

주문을 변경하면 변경 되나요?

UPDATE var SET bar=foo+1, foo=foo+1

+0

는 더 증가 없습니다 foo = 0이면 두 열 모두에서 1, 1이됩니다. – BaconSah

+0

증분 명령문은 어떻게 생깁니 까? 당신은 가 수행 루프를 사용하는 것 – hellohellosharp

+0

(내가 원하는 경우'bar' 2 일합니다) 세트 발 = 발까지 + 1 최종 저장 프로 시저 또는에서, 즉 의사의 성명, 같은 까지 주요 프로그램. 그리고 네, 저는 이것이 속는 사람이라는 데 동의합니다. – BaconSah

답변

7

Joe's SQL Fiddle comment에 의해 표시된 바와 같이, 그것은 참으로 문제 열 업데이트가 수행되는 어떤 순서로한다. UPDATE에 대한 MySQL의 문서는 각 열의 업데이트에 대한 표현이 선언 된 순서대로 평가됩니다 진술이를 나타내며, 항상 열의 "현재"값을 사용합니다 :

당신은에서 열을 액세스하는 경우 테이블에서 식에서 업데이트하려면 UPDATE은 열의 현재 값을 사용합니다.

UPDATE t1 SET col1 = col1 + 1; 

다음과 같은 성명의 두 번째 과제는 현재 (업데이트) col1 값이 아닌 원래의 col1 값으로 col2을 설정 : 예를 들어, 다음 문은 col1 현재 값보다 하나에 설정합니다. 결과적으로 col1col2은 같은 값을 갖게됩니다. 이 동작은 표준 SQL과 다릅니다.

UPDATE t1 SET col1 = col1 + 1, col2 = col1; 

단일 테이블 UPDATE 지정은 일반적으로 왼쪽에서 오른쪽으로 평가됩니다. 다중 테이블 갱신의 경우, 지정이 특정 순서로 수행된다는 보장은 없습니다.

은 그래서 UPDATE var SET foo=foo+1, bar=foo+1를 들어, foo은 다음 bar 업데이트는 foo+1foo의 새로 설정된 값을 사용합니다, foo+1로 설정됩니다.

이 동작은 SQL 표준과 다른 점에 유의해야합니다. 이는 모든 열 업데이트가 개념적으로 "동시에 발생"해야 함을 나타냅니다.

-2

foo는 = 1, 순서에 상관없이 [편집의 바 = 1 : MS-SQL있다. (분명히 MySQL에서 나쁘다)]

+1

코멘트의 SQL Fiddle 링크는 이것이 MySQL에 해당하지 않는다는 것을 나타냅니다 –

2

순서는 MySQL에서 중요합니다. 또한, 다음과 같은 작업을 수행 할 수 있습니다

update test set foo=foo+1, bar=foo+1, foo=bar+1; 

BTW, 여기에 또 다른 유용한 MySQL의 특정 트릭 :

insert into test (foo, bar) values ('some text', MD5(foo)); 
0

걸릴 노트 - 쿼리가

create table test (
field1 int2 default 0, 
field2 int2 default 0 
); 


insert into test values (1, 2); 


update test set field1 = field2, field2 = field1 +1; 


select * from test; 

결과 실행되는 동안 쿼리가 쿼리가 아닌 동적으로 변화하는 값의 시작 값으로 실행 PostgreSQL을 위해 :

field1, field2 
    2,2 
관련 문제