Database/MySQL

[MySQL] Error Code 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version 에러 해결하기

꽁담 2020. 9. 8. 17:22

상황



특정 서버에서 DUMP 한 아래 프로시저를 다른 서버에 반영하려고 합니다.


1
2
3
4
5
6
7
CREATE DEFINER=test@localhost PROCEDURE TEST()
BEGIN
  set @s=CONCAT('truncate table test', DATE_FORMAT(NOW(), '%c') % 3);
  PREPARE stmt FROM @s;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END
cs


이 때 오류가 발생했습니다.

Error Code: 1064. 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



오류 원인 및 해결 방안



1차 원인 - DEFINER 는 삭제

AS-IS 서버의 test 계정으로 define 되었기 때문에 definer 에 test 계정이 작성되어 DUMP 됩니다.

TO-BE 서버에는 TEST 계정이 없거나 환경이 다를 수 있으므로 definer 구문을 제거해야 합니다.

1
2
3
4
5
6
7
CREATE PROCEDURE TEST()
BEGIN
  set @s=CONCAT('truncate table test', DATE_FORMAT(NOW(), '%c') % 3);
  PREPARE stmt FROM @s;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END
cs



2차 원인 - DELIMITER $$ 의 부재

프로시저를 신규로 생성 시에 많은 구문에서 ';' 를 포함하기 때문에 정확한 종료시점을 알 수 없어서 에러가 발생합니다.

그래서 시작과 끝을 확실히 알 수 있도록 정의를 해주어야 합니다.

1
2
3
4
5
6
7
8
9
DELIMITER $$
CREATE PROCEDURE TEST()
BEGIN
  set @s=CONCAT('truncate table test', DATE_FORMAT(NOW(), '%c') % 3);
  PREPARE stmt FROM @s;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END$$
DELIMITER;
cs




2차 원인에서 작성한 쿼리로 수행하게 되면 프로시저가 생성됩니다.


일반적으로 객체 앞뒤로 ' 나 ` 를 작성을 안하거나 갯수가 일치하지 않아 문법오류가 발생하는 경우도 있으나

이번 같은 경우는 이게 문법오류인가..(?) 싶어서 정리하였습니다.