Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 단일 쿼리로 부울(Boolean) 필드 값 반전하는 방법

MySQL에서 단일 쿼리로 부울 필드 값 반전하기

네, 가능합니다. MySQL에서 제공하는 IF() 함수를 사용하면 하나의 UPDATE 쿼리만으로 부울(Boolean) 필드의 값을 손쉽게 반전(뒤집기)할 수 있습니다.

기본 문법은 다음과 같습니다.

UPDATE yourTableName SET yourBooleanColumnName = IF(yourBooleanColumnName, 0, 1);

IF() 함수는 첫 번째 인자가 참(TRUE, 1)이면 두 번째 인자를 반환하고, 거짓(FALSE, 0)이면 세 번째 인자를 반환합니다. 따라서 현재 값이 1이면 0으로, 0이면 1로 변경됩니다.

예제 테이블 생성

실제 동작을 확인하기 위해 먼저 테이블을 생성해 보겠습니다.

mysql> create table ReverseBooleanField
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> isValid BOOLEAN,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.56 sec)

샘플 데이터 삽입

INSERT 명령을 사용해 몇 개의 레코드를 추가합니다.

mysql> insert into ReverseBooleanField(isValid) values(true);
Query OK, 1 row affected (0.18 sec)

mysql> insert into ReverseBooleanField(isValid) values(false);
Query OK, 1 row affected (0.14 sec)

mysql> insert into ReverseBooleanField(isValid) values(true);
Query OK, 1 row affected (0.29 sec)

mysql> insert into ReverseBooleanField(isValid) values(true);
Query OK, 1 row affected (0.09 sec)

mysql> insert into ReverseBooleanField(isValid) values(false);
Query OK, 1 row affected (0.14 sec)

SELECT 문으로 전체 레코드를 조회해 보겠습니다.

mysql> select * from ReverseBooleanField;

실행 결과는 다음과 같습니다.

+----+---------+
| Id | isValid |
+----+---------+
|  1 |       1 |
|  2 |       0 |
|  3 |       1 |
|  4 |       1 |
|  5 |       0 |
+----+---------+
5 rows in set (0.00 sec)

BOOLEAN과 TINYINT의 관계

MySQL은 내부적으로 BOOLEAN 타입을 TINYINT(1)로 처리합니다. 즉, true는 1로, false는 0으로 저장됩니다. 이 점을 기억하면 부울 값 반전 로직을 훨씬 쉽게 이해할 수 있습니다.

단일 쿼리로 부울 필드 반전하기

이제 IF() 함수를 활용한 UPDATE 문으로 모든 행의 isValid 값을 한 번에 반전해 보겠습니다.

mysql> update ReverseBooleanField set isValid = if(isValid,0,1);
Query OK, 5 rows affected (0.21 sec)
Rows matched: 5  Changed: 5  Warnings: 0

SELECT 문으로 값이 실제로 반전되었는지 확인합니다.

mysql> select * from ReverseBooleanField;

실행 결과는 다음과 같습니다.

+----+---------+
| Id | isValid |
+----+---------+
|  1 |       0 |
|  2 |       1 |
|  3 |       0 |
|  4 |       0 |
|  5 |       1 |
+----+---------+
5 rows in set (0.00 sec)

모든 행의 값이 1→0, 0→1로 정상적으로 뒤집힌 것을 확인할 수 있습니다.

참고: 다른 대체 방법

IF() 함수 외에도 아래와 같은 방법으로 동일한 결과를 얻을 수 있습니다.

  • NOT 연산자: UPDATE 테이블명 SET 컬럼명 = NOT 컬럼명;
  • 산술 연산: UPDATE 테이블명 SET 컬럼명 = 1 - 컬럼명;
  • XOR 연산: UPDATE 테이블명 SET 컬럼명 = 컬럼명 XOR 1;

세 가지 방식 모두 0/1 값에 대해 동일하게 동작합니다. 다만 컬럼 값이 NULL인 경우 결과도 NULL이 되므로, 필요하다면 IFNULL() 함수를 함께 사용하는 것이 좋습니다.