我有一个spring boot应用程序,我尝试在应用程序启动时初始化一些数据。
这是我的应用程序属性:
#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
这是schema.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有什么问题。
答案 0 :(得分:6)
试试这段代码。删除PRIMARY KEY(
id )
并执行它。
CREATE TABLE IF NOT EXISTS `Person` (
`id` INTEGER PRIMARY KEY AUTO_INCREMENT,
`first_name` VARCHAR(50) NOT NULL,
`age` INTEGER NOT NULL
);
答案 1 :(得分:1)
尝试此操作,因为您已经使用过 Table_name
CREATE TABLE IF NOT EXISTS Person (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50) NOT NULL,
age INTEGER NOT NULL
);
答案 2 :(得分:1)
此错误是由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
。当您检查here时,列声明将遵循以下结构:
identifier datatype <constraints> <autoincrement> <functions>
因此,就您的情况而言,正如@budthapa和@Vishwanath Mataphati所提到的,您可以简单地从PRIMARY KEY(id)
声明中删除CREATE TABLE
行。此外,您已经在列定义的第一行指出id
是主键。
如果没有声明作为PRIMARY KEY声明,请确保在最后一个列声明之后检查是否有多余的逗号。
答案 3 :(得分:0)
使用另一个com.h2database版本。例如:1.4.199
答案 4 :(得分:0)
对我的情况有帮助的是从插入查询中的表名中删除单引号
我不得不改变这个:
INSERT INTO 'translator' (name, email) VALUES ('John Smith', 'john@mail.com');
为此:
INSERT INTO translator (name, email) VALUES ('John Smith', 'john@mail.com');