MySQL은 표준 SQL(ANSI SQL)과 대체로 호환되지만, 특정 상황에서는 여러 연산을 다른 방식으로 처리합니다. 이 글에서는 권한(Privileges), 외래 키 제약 조건(Foreign Key Constraints), 주석(Comments) 세 가지 측면에서 두 시스템의 주요 차이점을 살펴봅니다.
1. 권한(Privileges) 처리 방식
사용자 권한 관리와 관련해서도 MySQL과 표준 SQL 사이에는 여러 차이점이 존재합니다.
특히 주목할 점은, MySQL에서는 테이블을 삭제하더라도 해당 테이블에 부여된 권한이 자동으로 회수되지 않는다는 것입니다. 따라서 테이블의 권한을 명확히 해제하려면 REVOKE 문을 직접 실행해야 합니다. 이는 권한 관리를 소홀히 할 경우 보안상 허점이 될 수 있으므로, 테이블 삭제 시 권한 회수 여부를 반드시 확인하는 것이 좋습니다.
2. 외래 키 제약 조건(Foreign Key Constraints)
MySQL의 외래 키 제약 조건 구현 방식은 SQL 표준과 다소 차이가 있습니다.
동일 키 값이 여러 개인 경우
부모 테이블에 동일한 참조 키 값을 가진 행이 여러 개 존재할 때, InnoDB 엔진은 마치 같은 키 값을 가진 다른 부모 행이 존재하지 않는 것처럼 외래 키 검사를 수행합니다.
예를 들어 RESTRICT 유형의 제약 조건이 정의되어 있고, 하나의 자식 행이 여러 개의 부모 행을 참조하고 있다면, InnoDB는 해당 부모 행들의 삭제를 허용하지 않습니다.
행 단위 검사와 잠금
여러 행에 대해 INSERT, DELETE, UPDATE를 수행하는 SQL 문에서는 외래 키 제약 조건(유니크 제약 조건 포함)이 행 단위로 순차적으로 검사됩니다. 외래 키 검사가 진행되는 동안 InnoDB는 검사 대상인 자식 또는 부모 레코드에 공유 행 수준 잠금(shared row-level lock)을 설정합니다.
참조 열에 대한 요구 사항
MySQL은 성능상의 이유로 외래 키가 참조하는 열에 인덱스가 반드시 존재해야 한다고 요구합니다. 다만, 참조 열이 UNIQUE이거나 NOT NULL로 선언되어야 한다는 조건까지 강제하지는 않습니다.
3. 주석(Comments) 작성 방식
주석 처리 방식에서도 두 시스템 간에 차이가 있습니다.
- C 스타일 주석: 표준 SQL은
/* 이것은 주석입니다 */형태의 C 스타일 구문으로 주석을 작성하며, MySQL 서버 역시 이 구문을 지원합니다. - 한 줄 주석: 표준 SQL은
--(이중 하이픈)를 한 줄 주석의 시작 기호로 사용합니다. 반면 MySQL 서버는#를 주석 시작 문자로 사용합니다. 참고로 MySQL에서--주석을 사용하려면 하이픈 뒤에 공백이나 제어 문자가 있어야 한다는 점도 알아두면 좋습니다.
마무리
MySQL은 표준 SQL을 기반으로 하지만, 권한 회수, 외래 키 검사 방식, 주석 문법 등에서 고유한 동작 방식을 가지고 있습니다. 표준 SQL에 익숙한 개발자라면 이러한 차이점을 미리 숙지해 두어야 예기치 않은 오류나 보안 문제를 예방할 수 있습니다.