MySQL에서 SERIAL과 AUTO_INCREMENT는 모두 필드의 기본값으로 순차적인 번호(시퀀스)를 자동 생성하는 데 사용되는 기능입니다. 하지만 두 기능은 내부 동작 방식과 문법적 성격에서 중요한 차이점을 가지고 있습니다.
AUTO_INCREMENT란?
AUTO_INCREMENT 속성은 BIT와 DECIMAL을 제외한 모든 숫자 데이터 타입에서 사용할 수 있습니다. 한 테이블에는 오직 하나의 AUTO_INCREMENT 필드만 존재할 수 있으며, 한 테이블에서 생성된 시퀀스 값을 다른 테이블에서 재사용할 수 없습니다.
또한 이 속성은 시퀀스에 중복된 값이 발생하지 않도록 해당 필드에 UNIQUE 인덱스가 반드시 설정되어 있어야 합니다. 시퀀스는 기본적으로 1부터 시작하며, 레코드가 삽입될 때마다 1씩 증가합니다.
예제
mysql> Create Table Student(Student_id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, Name Varchar(20)); Query OK, 0 rows affected (0.18 sec)
위 쿼리는 Student_id 컬럼을 AUTO_INCREMENT로 선언했습니다.
mysql> Insert Into Student(Name) values('RAM'),('SHYAM');
Query OK, 2 rows affected (0.06 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> Select * from Student;
+------------+-------+
| Student_id | Name |
+------------+-------+
| 1 | RAM |
| 2 | SHYAM |
+------------+-------+
2 rows in set (0.00 sec)
mysql> Show Create Table Student\G
*************************** 1. row ***************************
Table: Student
Create Table: CREATE TABLE `student` (
`Student_id` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`Student_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
SERIAL(DEFAULT VALUE)란?
반면 SERIAL DEFAULT VALUE는 NOT NULL AUTO_INCREMENT UNIQUE KEY를 축약하여 표현하는 문법입니다. 즉, SERIAL을 사용하면 NOT NULL 제약 조건, AUTO_INCREMENT 속성, 그리고 UNIQUE 키가 한 번에 자동으로 적용됩니다. TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 같은 정수 계열 데이터 타입에서 SERIAL DEFAULT VALUE 키워드를 지원합니다.
예제
mysql> Create Table Student_serial(Student_id SERIAL, Name VArchar(20));
Query OK, 0 rows affected (0.17 sec)
mysql> Insert into Student_serial(Name) values('RAM'),('SHYAM');
Query OK, 2 rows affected (0.12 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> Select * from Student_serial;
+------------+-------+
| Student_id | Name |
+------------+-------+
| 1 | RAM |
| 2 | SHYAM |
+------------+-------+
2 rows in set (0.00 sec)
mysql> Show Create Table Student_serial\G
*************************** 1. row ***************************
Table: Student_serial
Create Table: CREATE TABLE `student_serial` (
`Student_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(20) DEFAULT NULL,
UNIQUE KEY `Student_id` (`Student_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
두 기능의 핵심 차이점 비교
- 데이터 타입: AUTO_INCREMENT는 BIT와 DECIMAL을 제외한 모든 숫자 타입에 적용할 수 있는 반면, SERIAL은 내부적으로
BIGINT UNSIGNED로 고정됩니다. - 문법 성격: SERIAL은 NOT NULL, AUTO_INCREMENT, UNIQUE 키가 결합된 축약형(shorthand) 표현입니다.
- UNIQUE 인덱스: AUTO_INCREMENT만 사용할 경우 개발자가 직접 PRIMARY KEY 또는 UNIQUE 인덱스를 지정해야 하지만, SERIAL은 UNIQUE 키가 자동으로 생성됩니다.
정리하면, 컬럼의 데이터 타입을 세밀하게 제어하고 싶다면 AUTO_INCREMENT를 직접 사용하고, 간편하게 고유한 자동 증가 키를 만들고 싶다면 SERIAL을 사용하는 것이 좋습니다.