2017-01-30 2 views
1

경우에 따라 한 열에서 다른 열로 값을 복사하고 첫 번째를 NULL로 설정해야합니다. 이 SQL 문은 예상대로 작동합니다.한 열에서 다른 열로 값 복사 및 NULL로 설정 - MySQL

UPDATE lessons SET order_id_old = order_id, order_id = NULL WHERE id = 1 

그러나 이것이 올바른 방법인지 확실하지 않습니다. 아니면이 목적으로 2 개의 쿼리를 더 사용해야합니까? documentation에서

UPDATE lessons SET order_id_old = order_id WHERE id = 1; 
UPDATE lessons SET order_id = NULL WHERE id = 1; 
+1

올바른 방법입니다. 잘 모르겠 으면 임시 테이블에 복사하고 먼저 테스트하십시오. – Ibu

+1

2 진술을 사용하는 경우 원 자성을 보장하기 위해 트랜잭션을 사용해야합니다. – Barmar

답변

2

나는 확실히 두 번째 접근법을 사용합니다. 여기에 documentation의 말씀입니다 : 바로 왼쪽에서

단일 테이블 UPDATE 할당은 일반적으로 평가됩니다. 다중 테이블 업데이트의 경우 특정 순서로 지정이 수행된다고 보장 할 수 없습니다.

귀하의 경우에는 테이블이 하나뿐이므로 현재로서는 문제가 없습니다. 그러나 누군가가이 진술을 수정하고 새로운 table/join을 추가하면 (이는 하나의 table과 같이 잘 작동한다고 가정 할 때) 작동이 멈추거나 일치하지 않는 결과가 발생합니다.

가독성/유지 관리 목적으로 두 번째 접근 방식을 사용하십시오. (또한 문을 모두 을 보존하기 위해 transaction에 배치하는 것이 좋습니다.

1

:

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

UPDATE t1 SET col1 = col1 + 1; 

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

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

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

귀하의 경우 단일 진술을 사용하는 것이 좋습니다.

관련 문제