MySQL에서 insert, add처럼 이미 문법상 특별한 의미로 쓰이는 예약어(Reserved Word)를 테이블명이나 컬럼명으로 그대로 사용하면 SQL 구문 오류가 발생합니다. 이 글에서는 오류가 발생하는 원인과 백틱(backtick)을 활용한 해결 방법을 살펴봅니다.
오류가 발생하는 원인
예약어는 MySQL 내부에서 이미 특정 기능을 수행하도록 정의된 키워드입니다. 따라서 별도의 처리 없이 테이블명이나 컬럼명으로 사용하면 MySQL은 이를 일반적인 식별자가 아닌 명령어로 해석하여 ERROR 1064 구문 오류를 반환합니다.
Case 1 — 예약어를 테이블명으로 사용한 경우
mysql> create table insert
-> (
-> Id int
-> );실행 결과 다음과 같은 오류가 발생합니다.
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'insert ( Id int )' at line 1
'insert'는 데이터를 삽입하는 데 사용되는 MySQL의 핵심 키워드이기 때문에 테이블명으로 그대로 쓸 수 없습니다.
Case 2 — 예약어를 컬럼명으로 사용한 경우
mysql> create table Customers
-> (
-> Add int
-> );실행 결과는 아래와 같습니다.
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Add int )' at line 3
컬럼명 'Add' 역시 MySQL의 예약어이기 때문에 동일한 구문 오류가 발생합니다.
해결 방법 1 — 예약어 목록을 숙지하고 피하기
가장 근본적인 방법은 테이블명이나 컬럼명을 지을 때 예약어를 사용하지 않는 것입니다. 대표적인 MySQL 예약어는 다음과 같습니다.
Insert Add Is Key Like 등
전체 예약어 목록은 MySQL 공식 문서에서 확인할 수 있습니다.
https://dev.mysql.com/doc/refman/5.7/en/keywords.html
해결 방법 2 — 백틱(`)으로 감싸기
부득이하게 예약어를 이름으로 사용해야 한다면, 해당 이름을 백틱(backtick, `)으로 감싸면 됩니다. 백틱으로 묶인 예약어는 MySQL이 일반 식별자로 인식하기 때문에 오류 없이 정상적으로 실행됩니다.
백틱 사용 예시
create table `insert`
테이블명과 컬럼명 모두에 백틱을 적용한 실제 예제입니다.
mysql> create table `Insert`
-> (
-> `Add` int
-> );
Query OK, 0 rows affected (0.59 sec)위와 같이 백틱으로 감싸주면 예약어를 사용했음에도 불구하고 어떠한 오류도 발생하지 않고 테이블이 성공적으로 생성됩니다.
정리
- MySQL 예약어를 테이블명·컬럼명으로 그대로 사용하면 ERROR 1064 구문 오류가 발생한다.
- 가장 좋은 방법은 예약어를 피해 다른 이름을 짓는 것이다.
- 꼭 예약어를 사용해야 한다면 백틱(`)`로 감싸서 일반 식별자로 처리하면 된다.