当前位置: 首页 > 知识库问答 >
问题:

Spring R2DBC-使用schema.sql创建h2表时出现“表已存在”错误

步建茗
2023-03-14

得到错误"表客户已经存在"当我试图创建一个表在H2内存数据库使用schema.sql.我使用的是Spring启动版本:2.5.4和以下是我的pom.xml.它的工作正常,如果我使用Spring启动版本:2.4.3

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.4</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.sample</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project</description>
<properties>
    <java.version>11</java.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-r2dbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>io.r2dbc</groupId>
        <artifactId>r2dbc-h2</artifactId>
        </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

这是我的代码

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Customer {
  @Id
  String id;
  String name;
}


//schema.sql
CREATE TABLE CUSTOMER (id SERIAL PRIMARY KEY, name VARCHAR(255));

@SpringBootApplication
public class ReactivedemoApplication {

  public static void main(String[] args) {
    SpringApplication.run(ReactivedemoApplication.class, args);
  }

  @Bean
  ConnectionFactoryInitializer initializer(ConnectionFactory connectionFactory) {

        ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer();
        initializer.setConnectionFactory(connectionFactory);
        initializer.setDatabasePopulator(new ResourceDatabasePopulator(new 
        ClassPathResource("schema.sql")));
        return initializer;
   }
}

当我启动应用程序时,我收到以下错误。如何强制H2使用schema.sql创建表格?

原因:io。r2dbc。spi。R2dbcBadGrammarException:表“CUSTOMER”已存在;SQL语句:在io处创建表CUSTOMER(id序列主键,名称VARCHAR(255))[42101-200]。r2dbc。h2.h2数据库例外工厂。在io上转换(H2DatabaseExceptionFactory.java:81)~[r2dbc-h2-0.8.4.RELEASE.jar:0.8.4.RELEASE]。r2dbc。h2.h2声明。lambda$execute$2(H2Statement.java:155)~[r2dbc-h2-0.8.4.RELEASE.jar:0.8.4.RELEASE]在Reactor。果心出版商FluxMapFuseable$MapFuseableSubscriber。onNext(FluxMapfusable.java:113)~[reactor-core-3.4.9.jar:3.4.9]。。。44由于:org而省略的公共帧。h2.jdbc。JdbcSQLSyntaxErrorException:表“CUSTOMER”已存在;SQL语句:创建表CUSTOMER(id序列主键,名称VARCHAR(255))[42101-200]

共有1个答案

郗唯
2023-03-14

因为spring已经从根位置模式创建了表。不需要sql、ConnectionFactoryInitializer bean。删除ConnectionFactoryInitializer bean声明修复了该问题。

 类似资料:
  • org.h2.jdbc.jdbcsqlsyntaxerrorexception:SQL语句“create TABLE HIBERNATE_SEQUENCE(NEXT_VAL BIGINT)engine=[*]myisam”中存在语法错误;应为“标识符”

  • 我正在用MySQL数据库构建一个django应用程序。当我第一次运行“Python Manage.py Migrate”时,一些表创建得很好,然后出现一些错误。引出的错误是: 完整的回溯是:

  • 我正在尝试使用EclipseLink创建一个表。正在使用的java类是:- EL警告]:2017-04-07 14:04:53.768--ServerSession(1650327539)--异常[EclipseLink-4002](Eclipse持久性服务-2.6.3.v20160428-59C81C5):org.Eclipse.Persistence.exceptions.DatabaseEx

  • 问题内容: 我在Docker容器中有一个MySQL数据库。入口点执行创建数据库的脚本和创建表的脚本。 除了一张桌子,其他所有东西都工作正常。 记录到控制台的错误是 第150行是后面的开括号 MySQL版本:8.0.3-rc-log 主机操作系统:Debian jessie 我开始考虑并且可能是保留关键字,因此我重命名了表和列,但错误仍然存​​在。 问题答案: @Bill Karwin在第一条评论中

  • 我想创建一个在MySQL中拥有自己数据库所有权限的用户。 当我使用这个用户创建一个表时,MySQL返回SQL server正在使用只读选项运行。 但是,当我改变到另一个现有用户的所有权限上,我可以创建表没有错误。 我想知道只读选项是全局的还是什么? 以下是我使用MySQL root的MySQL命令: 然后我切换到用户"demo": 所以我检查了只读选项,它似乎是打开的。 然而,我尝试使用另一个用户

  • 我试图使用boto3创建一个Dynamodb表。但我得到以下错误: "botocore.exceptions.ClientError:调用CreateTable操作时出错(ValidationExcture):无效的KeySchema:第一个KeySchemaElement不是HASH键类型" 更多信息:我的帐户中没有任何全局表。 我试过的代码: