[DB] DB 설계 시 칼럼명에 예약어를 사용하지 말자!

Arthur·2024년 5월 24일
0
post-thumbnail

작성하게 된 계기


회사 프로젝트를 진행하면서 SQL문을 작성하는 상황이 많았습니다.
근데 회사 DB 설계에서 칼럼에 예약어를 사용되어 있는 경우가 있었습니다.

예약어를 사용한 칼럼을 조회 시 아래와 같은 에러가 발생할 수 있습니다.

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 ...

예약어를 사용했기 때문에 문법 에러가 발생하는 것입니다.

이런 문제를 예방하기 위해서는 예약어 리스트를 확인후에 칼럼명을 선정 하는 것이 중요합니다.



예약어 리스트


예약어 리스트 토글 접기/펼치기
ADDALLALTER
ANALYZEANDAS
ASCASENSITIVEBEFORE
BETWEENBIGINTBINARY
BLOBBOTHBY
CALLCASCADECASE
CHANGECHARCHARACTER
CHECKCOLLATECOLUMN
CONDITIONCONSTRAINTCONTINUE
CONVERTCREATECROSS
CURRENT_DATECURRENT_TIMECURRENT_TIMESTAMP
CURRENT_USERCURSORDATABASE
DATABASESDAY_HOURDAY_MICROSECOND
DAY_MINUTEDAY_SECONDDEC
DECIMALDECLAREDEFAULT
DELAYEDDELETEDESC
DESCRIBEDETERMINISTICDISTINCT
DISTINCTROWDIVDOUBLE
DROPDUALEACH
ELSEELSEIFENCLOSED
ESCAPEDEXISTSEXIT
EXPLAINFALSEFETCH
FLOATFLOAT4FLOAT8
FORFORCEFOREIGN
FROMFULLTEXTGRANT
GROUPHAVINGHIGH_PRIORITY
HOUR_MICROSECONDHOUR_MINUTEHOUR_SECOND
IFIGNOREIN
INDEXINFILEINNER
INOUTINSENSITIVEINSERT
INTINT1INT2
INT3INT4INT8
INTEGERINTERVALINTO
ISITERATEJOIN
KEYKEYSKILL
LEADINGLEAVELEFT
LIKELIMITLINES
LOADLOCALTIMELOCALTIMESTAMP
LOCKLONGLONGBLOB
LONGTEXTLOOPLOW_PRIORITY
MATCHMEDIUMBLOBMEDIUMINT
MEDIUMTEXTMIDDLEINTMINUTE_MICROSECOND
MINUTE_SECONDMODMODIFIES
NATURALNOTNO_WRITE_TO_BINLOG
NULLNUMERICON
OPTIMIZEOPTIONOPTIONALLY
ORORDEROUT
OUTEROUTFILEPRECISION
PRIMARYPROCEDUREPURGE
READREADSREAL
REFERENCESREGEXPRELEASE
RENAMEREPEATREPLACE
REQUIRERESTRICTRETURN
REVOKERIGHTRLIKE
SCHEMASCHEMASSECOND_MICROSECOND
SELECTSENSITIVESEPARATOR
SETSHOWSMALLINT
SONAMESPATIALSPECIFIC
SQLSQLEXCEPTIONSQLSTATE
SQLWARNINGSQL_BIG_RESULTSQL_CALC_FOUND_ROWS
SQL_SMALL_RESULTSSLSTARTING
STRAIGHT_JOINTABLETERMINATED
THENTINYBLOBTINYINT
TINYTEXTTOTRAILING
TRIGGERTRUEUNDO
UNIONUNIQUEUNLOCK
UNSIGNEDUPDATEUSAGE
USEUSINGUTC_DATE
UTC_TIMEUTC_TIMESTAMPVALUES
VARBINARYVARCHARVARCHARACTER
VARYINGWHENWHERE
WHILEWITHWRITE
XORYEAR_MONTHZEROFILL

위 토글을 펼쳐보면 MySQL에서 사용하는 예약어 리스트를 확인 할 수 있습니다.
이런 예약어를 꼭 피해서 칼럼명을 선정해야 합니다.

만약에 이미 예약어를 사용 했으면 아래의 방법을 통해 해결할 수 있습니다.



이미 예약어를 사용한 경우 해결 방법


1. 인용 부호를 사용

SELECT "DESC" FROM table_name; -- SQL 표준 인용 부호
SELECT `DESC` FROM table_name; -- MySQL 백틱 사용

위와 같이 쿼리문 작성 시 백틱을 붙이거나 SQL 표준 인용 부호를 붙이면 쉽게 해결됩니다.



작성하면서 느낀 점


아주 간단한 방법으로 해결 할 수 있는 문제입니다.
하지만 이런 사소한 실수가 유지보수성을 엄청나게 떨어트린 다는 것을 알 수 있습니다.

이 문제는 컴파일 과정이 아닌 런타임 환경에서 발생할 수 있는 에러입니다.
JPA, Entity Framework와 같은 ORM을 사용한다고 해도 런타임 환경에서 에러가 발생합니다.

SQL Syntax 에러로 나오기 때문에 쿼리문 중에 어디가 문제가 있는지 하나씩 다 읽어보고 확인해 백틱을 붙여줘야 합니다.
(JPA는 Entity에 정의되어 있는 예약어 칼럼에 어노테이션을 추가해 해야 합니다.)

설계된 DB는 쉽게 변경이 힘들기 때문에 유지보수의 고통이 모두에게 되물림 될 수 있습니다.



참고 자료


  • mysql 예약어와 예약어를 필드명,데이터베이스명으로 사용시 에러문제해결 => 링크
  • 스택 오버 플로우 - Syntax error due to using a reserved word as a table or column name in MySQL => 링크
profile
기술에 대한 고민과 배운 것을 회고하는 게임 서버 개발자의 블로그입니다.

0개의 댓글