itsource

H2 스키마 초기화.SQL 문에 구문 오류가 있습니다.

mycopycode 2023. 7. 21. 21:37
반응형

H2 스키마 초기화.SQL 문에 구문 오류가 있습니다.

스프링 부트 응용 프로그램이 있는데 응용 프로그램 시작 시 일부 데이터를 초기화하려고 합니다.

다음은 내 응용 프로그램 속성입니다.

#Database connection
spring.datasource.url=jdbc:h2:mem:test_db
spring.datasource.username=...
spring.datasource.password=...
spring.datasource.driverClassName=org.h2.Driver

spring.datasource.initialize=true
spring.datasource.schema=schema.sql
spring.datasource.data=schema.sql


#Hibernate configuration
#spring.jpa.hibernate.ddl-auto = none

스키마입니다.sql:

CREATE TABLE IF NOT EXISTS `Person` (
  `id`         INTEGER  PRIMARY KEY AUTO_INCREMENT,
  `first_name` VARCHAR(50) NOT NULL,
  `age`        INTEGER  NOT NULL,
  PRIMARY KEY(`id`)
);

및 data.sql

INSERT INTO `Person` (
  `id`,
  `first_name`,
  `age`
) VALUES (
  1,
  'John',
  20
);

그러나 애플리케이션 시작 시 'SQL 문에 구문 오류'가 발생했습니다.

19:08:45.642 6474 [main] INFO  o.h.tool.hbm2ddl.SchemaExport - HHH000476: Executing import script '/import.sql'
19:08:45.643 6475 [main] ERROR o.h.tool.hbm2ddl.SchemaExport - HHH000388: Unsuccessful: CREATE TABLE Person (
19:08:45.643 6475 [main] ERROR o.h.tool.hbm2ddl.SchemaExport - Syntax error in SQL statement "CREATE TABLE PERSON ( [*]"; expected "identifier"
Syntax error in SQL statement "CREATE TABLE PERSON ( [*]"; expected "identifier"; SQL statement:

이해할 수가 없어요, 이 SQL에 무슨 문제가 있나요?

이 코드를 사용해 보십시오.제거한다.PRIMARY KEY(이드)실행합니다.

CREATE TABLE IF NOT EXISTS `Person` (
    `id`         INTEGER  PRIMARY KEY AUTO_INCREMENT,
     `first_name` VARCHAR(50) NOT NULL,
     `age`        INTEGER  NOT NULL
);

이 오류는 다음의 구조에서 발생합니다.CREATE TABLE선언.

SQL 선언의 끝에 쉼표가 하나 더 있으면 쉼표 뒤에 열 선언이 없습니다.예:

CREATE TABLE IF NOT EXISTS `Person` (
  `id`         INTEGER  PRIMARY KEY AUTO_INCREMENT,
  `first_name` VARCHAR(50) NOT NULL,
  `age`        INTEGER  NOT NULL,     --note this line has a comma in the end
);

그것은CREATE TABLE테이블과 함께 생성될 열 목록을 예상하며, 열의 첫 번째 매개 변수는identifier여기서 확인하면 열 선언은 다음 구조를 따릅니다.

identifier datatype <constraints> <autoincrement> <functions>

따라서, 당신의 경우, @budthapa @Vishwanath Mataphati가 언급했듯이, 당신은 간단히 제거할 수 있습니다.PRIMARY KEY(id)에서 나온 회선CREATE TABLE선언.또한 열 정의의 첫 번째 줄에 있는 기본 키라고 이미 언급했습니다.

주 키 선언으로 지정된 문이 없는 경우, 마지막 열 선언 다음에 추가 쉼표가 있는지 확인하십시오.

나는 아래의 application.properties에 추가되었고 그것은 나에게 효과가 있습니다.

봄.jpa. 속성hibernate.hibernate_hybernate_identifiers=true spring.jpa.properties.hibernate.dhibern_dhibern_identifier_column_definitions = true

사용해 본 대로 사용해 보십시오.

CREATE TABLE IF NOT EXISTS Person (
    id        INTEGER  PRIMARY KEY AUTO_INCREMENT,
     first_name VARCHAR(50) NOT NULL,
     age        INTEGER  NOT NULL
);

제 경우에 도움이 된 것은 삽입 쿼리의 테이블 이름에서 단일 따옴표를 제거한 것입니다.

나는 이것을 바꿔야 했습니다.

INSERT INTO 'translator' (name, email) VALUES ('John Smith', 'john@mail.com');

대상:

INSERT INTO translator (name, email) VALUES ('John Smith', 'john@mail.com');

자동 증분 ID를 설정하여 ID로 새 레코드를 삽입할 수 없습니다.

Try INSERT INTO `Person` (
  `first_name`,
  `age`
) VALUES (
  'John',
  20
);

저도 같은 문제에 부딪혔어요.이것으로 고쳤습니다.application.properties:

spring.jpa.properties.hibernate.connection.charSet=UTF-8
spring.jpa.properties.hibernate.hbm2ddl.import_files_sql_extractor=org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor

다중 회선 및 기본 인코딩과 관련된 문제가 있습니다.

JPA Entity의 필드 중 하나가 SQL reserved 키워드(FROM).

이전:

@Entity
public class Event {

    ...

    @NotNull
    private LocalDateTime from;

}

수정:

@Entity
public class Event {

    ...

    @NotNull
    private LocalDateTime fromDate;

}

저의 경우 문제는 "연도"라는 정수 필드를 사용하는 것이었습니다.

언급URL : https://stackoverflow.com/questions/44267245/h2-schema-initialization-syntax-error-in-sql-statement

반응형