MySQL에서 예약된 단어를 테이블 또는 열 이름으로 사용하여 구문 오류 발생
아래와 같이 간단한 MySQL 쿼리를 실행하려고 합니다.
INSERT INTO user_details (username, location, key)
VALUES ('Tim', 'Florida', 42)
그러나 다음 오류가 발생합니다.
오류 1064(42000):구문에 . 에서 SQL 구에오 근처에서 하십시오. MySQL 서버 버전에 해당하는 설명서에서 사용할 구문을 확인하십시오.
'key) VALUES ('Tim', 'Florida', 42)'
문제를 해결하려면 어떻게 해야 합니까?
문제
MySQL과 같은 단어를 사용합니다.SELECT
,INSERT
,DELETE
등은 예약된 단어입니다.MySQL은 특별한 의미를 가지고 있기 때문에 식별자를 백스틱으로 둘러싸지 않는 한 테이블 이름, 열 이름 또는 다른 종류의 식별자로 사용할 때마다 구문 오류로 처리합니다.
공식 문서에 명시된 대로 10.2 섹션의 스키마 개체 이름(강조 추가):
MySQL 내의 특정 개체(데이터베이스, 테이블, 인덱스, 열, 별칭, 보기, 저장 프로시저, 파티션, 테이블스페이스 및 기타 개체 이름 포함)를 식별자라고 합니다.
...
식별자에 특수 문자가 포함되어 있거나 예약된 단어인 경우, 식별자를 참조할 때마다 따옴표로 묶어야 합니다.
...
식별자 따옴표 문자는 백티크(")입니다.
`
"):
키워드 및 예약 단어의 전체 목록은 섹션 10.3 키워드 및 예약 단어에서 찾을 수 있습니다.해당 페이지에서 "(R)" 뒤에 오는 단어는 예약된 단어입니다.이 문제의 원인이 되는 많은 단어를 포함하여 일부 예약된 단어가 아래에 나열되어 있습니다.
- 더하다
- 그리고.
- 전에
- 타고
- 불러
- 사례.
- 조건.
- 삭제
- DESC
- 묘사하라
- 부터
- 그룹.
- 인
- 색인
- 삽입
- 간격
- IS
- 열쇠
- 맘에 들다
- 제한.
- 긴
- 경기
- 것은 아니다.
- 선택
- OR
- 주문
- 파티션
- 순위
- 참조
- 선택한다.
- 테이블
- 로.
- 갱신하다
- 어디에
해결책
두 가지 옵션이 있습니다.
예약된 단어를 식별자로 사용 안 함
가장 간단한 해결책은 예약된 단어를 식별자로 사용하지 않는 것입니다.예약된 단어가 아닌 다른 적절한 이름의 열을 찾을 수 있습니다.
이렇게 하면 다음과 같은 몇 가지 이점이 있습니다.
데이터베이스를 사용하는 사용자 또는 다른 개발자가 특정 식별자가 예약된 단어라는 것을 잊어버리거나 알지 못해 구문 오류를 작성할 가능성을 제거합니다.MySQL에는 예약된 단어가 많이 있으며 대부분의 개발자는 이 단어들을 모두 알지 못할 것입니다.애초에 이러한 단어를 사용하지 않음으로써 자신이나 미래의 개발자에게 함정을 남기는 것을 피할 수 있습니다.
식별자를 인용하는 방법은 SQL 방언마다 다릅니다.MySQL은 기본적으로 식별자를 따옴표로 묶는 데 백틱을 사용하지만, ANSI 호환 SQL(그리고 여기에 명시된 대로 ANSI SQL 모드의 MySQL)은 식별자를 따옴표로 묶는 데 사용합니다.따라서 백스틱으로 식별자를 인용하는 쿼리는 다른 SQL 방언으로 쉽게 이동할 수 없습니다.
순수하게 미래의 실수의 위험을 줄이기 위해, 이것은 보통 식별자를 뒤로 인용하는 것보다 현명한 행동 방침입니다.
백스틱 사용
테이블 또는 열의 이름을 바꿀 수 없는 경우, 문제가 되는 식별자를 백스틱으로 묶습니다.`
10.2 스키마 개체 이름의 이전 인용문에 설명된 대로입니다.
사용법을 보여주는 예(10.3 키워드 및 예약 단어에서 발췌):
mysql> CREATE TABLE interval (begin INT, end INT); ERROR 1064 (42000): You have an error in your SQL syntax. near 'interval (begin INT, end INT)'
mysql> CREATE TABLE `interval` (begin INT, end INT); Query OK, 0 rows affected (0.01 sec)
마찬가지로, 질문의 쿼리는 키워드를 감아서 수정할 수 있습니다.key
아래에 표시된 바와 같이 백택스로 표시됩니다.
INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)"; ^ ^
언급URL : https://stackoverflow.com/questions/76031130/keep-getting-warning-java-sql-sqlsyntaxerrorexception
'sourcecode' 카테고리의 다른 글
내 코드가 Windows로 컴파일되고 있는지 확인할 수 있는 매크로가 있습니까? (0) | 2023.07.27 |
---|---|
노드 모듈 이름에 @ 기호 사용 (0) | 2023.07.27 |
"wait_message: 응답을 수신하지 못했습니다. 10004003"? (0) | 2023.07.27 |
oracle sql에서 두 날짜 사이의 경과 시간 찾기 (0) | 2023.07.27 |
특정 숫자의 숫자로 난수를 생성하는 방법은 무엇입니까? (0) | 2023.07.22 |