MySQL에서 특정 컬럼에 음수 값이 저장되지 않도록 하려면 INT UNSIGNED(부호 없는 정수) 타입을 사용하면 됩니다. UNSIGNED로 선언된 컬럼은 0 이상의 값만 허용하며, 음수를 삽입하려고 하면 MySQL이 에러를 반환합니다.
일반적인 INT 타입은 약 -21억부터 +21억까지의 범위를 가지지만, INT UNSIGNED는 같은 저장 공간으로 0부터 약 42억(4,294,967,295)까지 표현할 수 있어 게임 점수처럼 음수가 필요 없는 데이터에 더욱 적합합니다.
아래에서 실제 예제를 통해 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 사용자의 게임 점수를 저장하는 UserGameScores 컬럼을 포함한 테이블을 생성합니다.
mysql> create table preventNegativeNumberDemo
-> (
-> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> UserName varchar(20),
-> UserGameScores int
-> );
Query OK, 0 rows affected (1.74 sec)
2. INT UNSIGNED로 컬럼 수정
음수 입력을 차단하기 위해 ALTER TABLE 문으로 해당 컬럼을 INT UNSIGNED로 변경합니다.
mysql> alter table preventNegativeNumberDemo modify column UserGameScores INT UNSIGNED NOT NULL;
Query OK, 0 rows affected (3.32 sec)
Records: 0 Duplicates: 0 Warnings: 0
3. 변경된 테이블 구조 확인
DESC 명령으로 컬럼이 올바르게 변경되었는지 확인합니다.
mysql> desc preventNegativeNumberDemo;
실행 결과는 다음과 같습니다. UserGameScores 컬럼의 타입이 int(10) unsigned로 바뀐 것을 확인할 수 있습니다.
+----------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------------+------+-----+---------+----------------+
| UserId | int(11) | NO | PRI | NULL | auto_increment |
| UserName | varchar(20) | YES | | NULL | |
| UserGameScores | int(10) unsigned | NO | | NULL | |
+----------------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
4. 음수 삽입 테스트
이제 양수와 음수 값을 함께 삽입해 보겠습니다. 컬럼이 INT UNSIGNED로 설정되어 있기 때문에 음수를 넣으면 MySQL이 에러를 발생시킵니다.
mysql> insert into preventNegativeNumberDemo(UserName,UserGameScores) values('Larry',0);
Query OK, 1 row affected (1.20 sec)
mysql> insert into preventNegativeNumberDemo(UserName,UserGameScores) values('Mike',-1);
ERROR 1264 (22003): Out of range value for column 'UserGameScores' at row 1
mysql> insert into preventNegativeNumberDemo(UserName,UserGameScores) values('Sam',-100);
ERROR 1264 (22003): Out of range value for column 'UserGameScores' at row 1
mysql> insert into preventNegativeNumberDemo(UserName,UserGameScores) values('John',100);
Query OK, 1 row affected (0.84 sec)
mysql> insert into preventNegativeNumberDemo(UserName,UserGameScores) values('Bob',200);
Query OK, 1 row affected (0.48 sec)위 실행 결과에서 볼 수 있듯이, 음수(-1, -100)를 삽입하려고 하면 ERROR 1264 (Out of range value) 오류가 발생하며 데이터가 저장되지 않습니다. 반면 0을 포함한 양수는 정상적으로 입력됩니다.
5. 최종 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회하면, 음수는 모두 거부되고 양수 값만 저장된 것을 확인할 수 있습니다.
mysql> select *from preventNegativeNumberDemo;
실행 결과는 다음과 같습니다.
+--------+----------+----------------+
| UserId | UserName | UserGameScores |
+--------+----------+----------------+
| 1 | Larry | 0 |
| 2 | John | 100 |
| 3 | Bob | 200 |
+--------+----------+----------------+
3 rows in set (0.00 sec)
마무리
이처럼 MySQL에서 음수 입력을 방지하는 가장 간단하고 확실한 방법은 컬럼 타입을 UNSIGNED로 지정하는 것입니다. 애플리케이션 레벨에서 유효성 검사를 추가로 수행할 수도 있지만, 데이터베이스 자체에서 제약을 걸어두면 잘못된 데이터가 저장되는 것을 근본적으로 차단할 수 있습니다. 점수, 수량, 나이 등 음수가 될 수 없는 값에는 INT UNSIGNED 또는 BIGINT UNSIGNED 사용을 권장합니다.