首页 > 数据库 >向PostgreSQL数据库插入Date类型数据报错

向PostgreSQL数据库插入Date类型数据报错

时间:2024-12-05 08:59:06浏览次数:5  
标签:... PostgreSQL -- 数据库 插入 报错 Date 省略

问题场景

这个是公司项目进行更改,将项目的数据库从Oracle版本改为PostgreSQL版本时发生的错误。

控制台报错内容。

SQL: insert into table (...,RQ,...) select ...,?,... union all select ...,?,...
//(这里的...省略了其他字段, 主要是RQ日期类型报错就没列出)
Cause: org.postgresql.util.PSQLException: 错误: 字段 "rq" 的类型为 timestamp without time zone, 但表达式的类型为 text
建议:你需要重写或转换表达式 位置:404

mapper文件中的动态sql为

<insert id="insert" parameterType="java.util.List">
  insert into table
  (
  -- 省略,
  RQ,
  -- 省略)
  <foreach collection="list" item="item" separator="union all">
    select
    -- 省略,
    #{item.rq,jdbcType=TIMESTAMP},
    -- 省略
    -- from dual 这里当时是将项目Oracle数据库转为PostgreSQL数据库
  </foreach>
</insert>

对应的实体类为

@Data
public class Entity {
    // 省略
    private Date rq;
    // 省略
}

当在插入数据到数据库的时候就会报字段RQ类型错误的问题,但是通过检查sql语句后并没有发现明显的错误。

虽然控制台报错了,但还是能插入几条数据到数据库中,然后就报错不能插入了。这个时候考虑到有可能插入数据的问题,但是这里设置了#{item.rq,jdbcType=TIMESTAMP},数据类型也是符合PostgreSQL数据库的日期类型timestamp的,所以也不是这个的问题。

这个时候我将数据库中的数据清除,重新执行了几遍程序后发现有时候能够向数据库中插入几条数据,然后就报错,有时候一条数据都没有插入就报错了,很是奇怪。

解决方法

后面使用了PostgreSQL的特定的语法,在rq后面加上::timestamp就能够正常插入了,如下

<insert id="insert" parameterType="java.util.List">
  insert into table
  (
  -- 省略,
  RQ,
  -- 省略)
  <foreach collection="list" item="item" separator="union all">
    select
    -- 省略,
    #{item.rq,jdbcType=TIMESTAMP}::timestamp,
    -- 省略
    -- from dual -- 这里是Oracle数据库的语法
  </foreach>
</insert>

但这样每个日期的字段都要加上这个,更改起来很麻烦,所以我在想有没有更好的解决方案。

后面我更改了这一条批量插入的动态sql。由于这个sql在Oracle数据库中是能够正常的运行的,有可能在PostgreSQL数据库存在兼容的问题,所以改成了在使用Mysql数据库时常写的动态sql,如下:

<insert id="inser" parameterType="java.util.List">
        insert into table (
        -- 省略,
        RQ,
        -- 省略)
        values
        <foreach collection="list" item="item" separator=",">
            (
            -- 省略,
            #{item.rq,jdbcType=TIMESTAMP},
            -- 省略
            )
        </foreach>
    </insert>

重新执行程序后,没有报错,数据正常插入,完美解决!

标签:...,PostgreSQL,--,数据库,插入,报错,Date,省略
From: https://www.cnblogs.com/errors1/p/18587714

相关文章

  • Bclinux离线安装PostgreSQL10.23+PostGIS2.5编译安装配置
    一、安装PostgreSQL1、安装PostgreSQL解压PostgreSQL软件包tar-zxvfpostgresql.tar.gz配置并安装PostgreSQL[postgres@localhostsetup]$tar-zxvfpostgresql-10.23.tar.gz进入解压后的目录,按照PostgreSQL的官方文档进行配置和安装。这通常涉及到创建数据目录、配置postgresq......
  • c++中报错:未定义标识符“string” (含解决方法)
    敲代码的时候编译器一直报错如下:解决方案如下1.检查是否引入了头文件,示例如下#include<string>//注意:c语言中的头文件是<string.h>不要搞混了,c++这里没有.h后缀2.是否在代码中指定这个string属于std命名空间示例一:在引入头文件后直接加入这一行usingnamespacestd;......
  • 安装MongoDB报错或者使用net start MongoDB 报错解决
    报错信息:Service‘MongoDBServer(MongoDB)’(MongoDB)failedtostart.Verifythatyouhavesufficientprivilegestostartsystemservices.解决方案:可以先删除MongoDB服务scdeleteMongoDB然后在MongoDB下载地址里的Data目录创建db文件在log目录下创建MongoDB......
  • 无法科学上网导致docker compose up -d报错,已解决
    MilvusMilvus是一款开源的向量数据库,具有高度的灵活性、稳定可靠性以及高速查询等特点。它支持针对TB级向量的增删改操作和近实时查询,适用于大规模向量数据的存储和检索。Milvus的官网:https://milvus.ioGithub上Milvus的链接:https://github.com/milvus-ioDockerDocker是......
  • CentOS报错:No suitable device found for this connection device lo not available b
    执行命令:ifup lo 时,Centos无法获取IP报错:Nosuitabledevicefoundforthisconnectiondevicelonotavailablebecausedeviceisstrictlyunmanaged1.错误现象Nosuitabledevicefoundforthisconnection(devicelonotavailablebecausedeviceisstrictlyu......
  • postgresql集成pgvector,postgresml,实现开源库内机器学习
    1.pgvectorhttps://github.com/pgvector/pgvector.gitcd/tmpgitclone--branchv0.8.0https://github.com/pgvector/pgvector.gitcdpgvectormakemakeinstall#可能需要加sudo权限问题记录:src/bitutils.c:1:10:fatalerror:'postgres.h'filenotfoundin......
  • 用rman备份数据库时,报错:ORA-27037: unable to obtain file status,检查过期归档日志
    现象:在测试机上测试备份集的可用性的时候,我用rman恢复了一个数据库,是不完全恢复,也就是用一个0级备份,恢复数据文件,用一个归档日志文件备份恢复控制文件和归档日志文件,再recoverdatabase,然后再用resetlogs方式open数据库。此时,我将测试数据库当作一个生产库做实验,应该给数据库......
  • 达梦网络通信异常-断开的管道(write failed)报错排查及解决过程
    应用连接数据库偶发性报网络通信异常,报错截图如下:查看驱动版本,应用所用的驱动和数据库当前版本匹配 数据库版本 网络和数据库日志方面也没有问题,连接池超时设置调整之后还是报错 应用报错日志有断开的管道 根据网上参考类似错误。应该是长时间没有刷新页面导致数......
  • 解决docker拉取镜像报错,Error response from daemon: Get "[https://registry-1.docke
    拉取镜像报错,Errorresponsefromdaemon:Get"[https://registry-1.docker.io/v2/":](https://registry-1.docker.io/v2/":)net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)原因:镜像源问题,需更换可用的镜像源解......
  • git pull 报错怎么解决?
    gitpull报错的原因有很多,前端开发中常见的报错和解决方法如下:1.本地修改与远程分支冲突:报错信息:error:Yourlocalchangestothefollowingfileswouldbeoverwrittenbymerge或Automaticmergefailed;fixconflictsandthencommittheresult.原因:你在......