13.2.11 UPDATE 구문
단일 테이블 구문 :
UPDATE [LOW_PRIORITY] [IGNORE]table_reference
SETcol_name1
={expr1
|DEFAULT} [,col_name2
={expr2
|DEFAULT}] ... [WHEREwhere_condition
] [ORDER BY ...] [LIMITrow_count
]
여러 테이블 구문 :
UPDATE [LOW_PRIORITY] [IGNORE]table_references
SETcol_name1
= {expr1
| DEFAULT},col_name2
= {expr2
| DEFAULT}] ... [WHEREwhere_condition
]
단일 테이블 구문의 경우 UPDATE
문은 지정된 테이블의 기존 행의 열을 새 값으로 업데이트합니다. SET
절은 변경할 열의와 그 컬럼에 지정되는 값을 나타냅니다. 각 값은 식 또는 컬럼을 명시 적으로 기본값으로 설정하는 키워드 DEFAULT
로 지정할 수 있습니다. WHERE
절 (지정된 경우)은 어떤 행을 업데이트하는 방법을 식별하는 조건을 지정합니다. WHERE
절이 없으면 모든 행이 갱신됩니다. ORDER BY
절이 지정된 경우, 지정된 순서대로 행이 갱신됩니다. LIMIT
절은 업데이트 할 행 수에 제한을 설정합니다.
여러 테이블 구문의 경우, UPDATE
는 조건을 충족 table_references
에 지정된 각 테이블의 행을 업데이트합니다. 일치하는 행은 조건에 여러 번 일치 한 경우에도 1 회 업데이트됩니다. 여러 테이블 구문의 경우 ORDER BY
와 LIMIT
를 사용할 수 없습니다.
파티션 된 테이블의 경우이 문을 한 테이블과 다중 테이블 형식 모두로 테이블 참조의 일부로 PARTITION
옵션의 사용이 지원됩니다. 이 옵션은 하나 이상의 파티션 또는 서브 파티션 (또는 둘 다)의 목록을받습니다. 나열되어있는 파티션 (또는 서브 파티션) 만 일치를 확인하고 이러한 파티션 또는 서브 파티션의 어느 것에도 존재하지 않는 행은 where_condition
을 충족하는지 여부에 관계없이 업데이트되지 않습니다.
INSERT
또는 REPLACE
문에서 PARTITION
을 사용하는 경우와는 달리, 그 이외는 유효한 UPDATE ... PARTITION
문은 나열되어있는 파티션 (또는 서브 파티션) 내에서 임의의 행 where_condition
에 일치하지 않는 경우 성공했다고 간주됩니다.
자세한 내용 및 예제는 섹션 19.5 "파티션 선택" 을 참조하십시오.
where_condition
은 갱신되는 각 행에 대해 true로 평가되는 식입니다. 식의 구문은 섹션 9.5 "식의 구문" 을 참조하십시오.
table_references
과 where_condition
은 섹션 13.2.9 "SELECT 구문" 에 설명 된대로 지정됩니다.
실제로 업데이트 된 UPDATE
에서 참조되는 컬럼에 대해서만 UPDATE
권한이 필요합니다. 읽을 만 변경되지 않는 컬럼에 대해서는 SELECT
권한 만 필요합니다.
UPDATE
문은 다음 수정 지원합니다.
LOW_PRIORITY
키워드를 사용하면UPDATE
의 실행은 다른 어떤 클라이언트도 테이블에서 읽은 않을 때까지 지연됩니다. 이것은 테이블 수준 잠금만을 사용하는 스토리지 엔진 (MyISAM
,MEMORY
및MERGE
)에만 영향을 미칩니다.IGNORE
키워드를 지정하면 업데이트하는 동안 오류가 발생하더라도 업데이트 문은 중단되지 않습니다. 고유 키 값에 대해 중복 키 충돌이 발생한 행은 갱신되지 않습니다. 데이터 변환 오류의 원인이되는 값으로 업데이트 된 행은 대신 가장 가까운 유효한 값으로 업데이트됩니다.
MySQL 5.6.4 이후에서는 UPDATE IGNORE
문 ( ORDER BY
절이있는 것을 포함한다)에는 문 기반 복제는 안전하지 않은 플래그가 지정됩니다. (이것은 어떤 행이 무시되거나이 행이 업데이트되는 순서에 의해 결정되기 때문입니다.) 이러한 변경으로 인해 이러한 문은 명령문 기반 모드를 사용하는 경우에는 로그에 경고를 생성하고 MIXED
모드를 사용하는 경우 행 기반 형식을 사용하여 기록됩니다. (Bug # 11758262, Bug # 50439) 자세한 내용은 섹션 17.1.2.3 "바이너리 로그에서의 안전 및 안전하지 않은 문의 판단" 을 참조하십시오.
식으로 갱신되는 테이블의 컬럼에 접근하는 경우, UPDATE
는 그 컬럼의 현재 값을 사용합니다. 예를 들어, 다음 명령문은 col1
을 현재의 값보다 1 큰 값으로 설정합니다.
UPDATE t1 SET col1 = col1 + 1;
다음 문의 두 번째 과제는 col2
를 원래의 col1
값이 아니라 현재의 (업데이트 된) col1
값으로 설정합니다. 이 결과 col1
과 col2
의 값이 동일합니다. 이 동작은 표준 SQL과는 다릅니다.
UPDATE t1 SET col1 = col1 + 1 col2 = col1;
단일 테이블의 UPDATE
할당은 일반적으로 왼쪽에서 오른쪽으로 평가됩니다. 여러 테이블 업데이트에서는 할당이 특정 순서로 실행된다는 보장이 없습니다.
컬럼을 현재 값으로 설정 한 경우는 MySQL이이를 인식하고 해당 업데이트를 제공하지 않습니다.
NOT NULL
로 선언 된 컬럼을 NULL
로 설정하여 업데이트하면 엄격한 SQL 모드가 활성화되어있는 경우 오류가 발생합니다. 그렇지 않은 경우, 그 컬럼은 컬럼 데이터 유형의 암시 적 기본값으로 설정되어 경고 수가 1만큼 증가합니다. 암시 적 기본값은 숫자 형은 0
, 문자열은 빈 문자열 ( ''
), 날짜 및 시간 형식이 "0"의 값입니다. 섹션 11.6 "데이터 유형 기본값" 을 참조하십시오.
UPDATE
는 실제로 변경된 행수를 돌려줍니다. mysql_info()
C API 함수는 일치하고 업데이트 된 행 수와 UPDATE
중에 발생한 경고의 수를 돌려줍니다.
LIMIT
를 사용하면 row_count
UPDATE
의 범위를 제한 할 수 있습니다. LIMIT
절은 일치하는 행 제한입니다. 이 문은 실제로 변경된 여부에 관계없이 WHERE
절을 충족 row_count
행을 찾을 즉시 중지합니다.
UPDATE
문에 ORDER BY
절이 포함 된 경우는이 절에서 지정된 순서대로 행이 갱신됩니다. 이것은 보통이면 오류가 발생할 수있는 특정 상황에서 유용 할 수 있습니다. 테이블 t
에 고유 인덱스를 가진 컬럼 id
가 포함되어 있다고합니다. 다음 문은 행이 업데이트되는 순서에 따라 중복 키 오류로 실패 할 수 있습니다.
UPDATE t SET id = id + 1;
예를 들어,이 테이블의 id
컬럼에 1과 2가 포함되어 있으며, 2 세에 업데이트되기 전에 1이 2로 업데이트 된 경우 오류가 발생합니다. 이 문제를 해결하려면 큰 id
값을 가진 행이 작은 값을 가지는 행의 전에 업데이트되도록 ORDER BY
절을 추가합니다.
UPDATE t SET id = id + 1 ORDER BY id DESC;
또한 여러 테이블을 범위에 포함 UPDATE
작업을 수행 할 수 있습니다. 그러나 여러 테이블의 UPDATE
에서는 ORDER BY
또는 LIMIT
를 사용할 수 없습니다. table_references
절은 조인에 포함 된 테이블을 나열합니다. 그 구문은 섹션 13.2.9.2 "JOIN" 에 설명되어 있습니다. 예를 나타냅니다.
UPDATE items, month SET items.price = month.price WHERE items.id = month.id;
앞의 예는 쉼표 연산자를 사용하는 내부 결합을 나타내고 있습니다 만, 복수 테이블의 UPDATE
문은 SELECT
문에서 허용되는 모든 유형의 결합 ( LEFT JOIN
등)를 사용할 수 있습니다.
외부 키 제약이 존재하는 InnoDB
테이블을 포함한 여러 테이블의 UPDATE
문을 사용하면 MySQL 최적화가 그 부모의 순서와 다른 순서로 테이블을 처리 할 수 있습니다. 이 경우 문이 실패하고 롤백됩니다. 대신 하나의 테이블을 업데이트 한 뒤, InnoDB
가 제공하는 ON UPDATE
기능을 사용하여 다른 테이블이 그에 따라 변경 될 수 있습니다. 섹션 14.6.6 "InnoDB와 FOREIGN KEY 제약 조건" 을 참조하십시오.
현재 테이블을 업데이트하고, 하위 쿼리 같은 테이블에서 선택 할 수 없습니다.
MySQL 5.6.6 이전에는 테이블 수준의 잠금을 채용 한 MyISAM
등의 스토리지 엔진을 사용하는 파티션 된 테이블에 대한 UPDATE
에 의해 그 테이블의 모든 파티션이 잠겨있었습니다. 이것은 UPDATE ... PARTITION
쿼리에 적용했습니다. (이것은 행 레벨 락을 채용 한 InnoDB
등의 스토리지 엔진에서 발생하지 않았고 현재도 발생하지 않습니다.) MySQL 5.6.6 이후에서는, MySQL은 파티션 잠금 가지 치기를 사용합니다. 그러면 그 테이블 중 하나 분할 열이 업데이트되지 않는 한, UPDATE
문 WHERE
절에 일치하는 행을 포함하는 파티션 만 실제로 잠기도록합니다. 자세한 내용은 섹션 19.6.4 "파티셔닝 및 잠금" 을 참조하십시오.