我想将数据插入到h2表中,其中包含来自csv文件的decimal(13, 4)
列,但我得到以下错误
org.springframework.jdbc.datasource.init.ScriptStatementFailedException at ScriptUtils.java:622
Caused by: org.h2.jdbc.JdbcSQLDataException at DbException.java:457
Caused by: java.lang.NumberFormatException at BigDecimal.java:577
这是csv文件
username,name,grupo,amount,percentage
MYUSER,CLIENT NAME,THE GROUP,30545000,0.093438569266185,
this is my table
create table my_table
(
mytable_id integer NOT NULL AUTO_INCREMENT,
user varchar(30) NOT NULL,
name varchar(300) DEFAULT NULL,
grupo varchar(300) DEFAULT NULL,
amount DECIMAL(13, 4) DEFAULT NULL,
percentage decimal(5, 2) DEFAULT NULL,
PRIMARY KEY (mytable_id)
);
这是我的JPA实体类
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "my_table")
public class CreditLineSummaryJPA {
@Id
@Column(name = "mytable_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long mytableId;
@Column(name = "user")
private String user;
@Column(name = "name")
private String name;
@Column(name = "grupo")
private String grupo;
@Column(name = "amount")
private BigDecimal amount;
@Column(name = "percentage")
private double userPercentage;
}
,这是从CSV文件
插入的SQL语句INSERT INTO my_table(user, name, the_group, amount, user_percentage)
SELECT "username", "name", "grupo", CONVERT("amount", decimal(13, 4)),
CONVERT ("percentage", decimal(5, 2))
FROM CSVREAD( 'myFile.csv', 'charset=UTF-8');
返回以下错误
org.springframework.jdbc.datasource.init.ScriptStatementFailedException at ScriptUtils.java:622
Caused by: org.h2.jdbc.JdbcSQLDataException at DbException.java:457
Caused by: java.lang.NumberFormatException at BigDecimal.java:577
编辑使用双引号后,现在的错误是显示
org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "username" not found; SQL statement
CSVREAD
的第二个参数是一个列名称列表:https://h2database.com/html/functions.html csvread
在你的例子中应该是NULL
:
CSVREAD('myFile.csv', NULL, 'charset=UTF-8')
CSV中没有空格的列名通常转换为大写(但这取决于数据库设置),所以如果你想引用它们,你需要用大写("USERNAME"
等)来写它们,或者你可以不带引号来写它们:
INSERT INTO my_table(user, name, grupo, amount, percentage)
SELECT username, name, grupo, CAST(amount AS decimal(13, 4)),
CAST(percentage AS decimal(5, 2))
FROM CSVREAD('myFile.csv', NULL, 'charset=UTF-8');
其他注意事项
- 不要使用
CONVERT
,它是JDBC的一部分,但它根本不可靠,在H2中它的行为还取决于兼容模式。使用CAST
规范,它是SQL标准的一部分。 - CAST规范(或
CONVERT
函数)可能在这种特定情况下被删除,INSERT
语句将自己将所有值转换为列的数据类型。 DEFAULT NULL
没有意义;如果没有指定value,将自动插入NULL
,不需要任何附加子句。DEFAULT NULL
不是NOT NULL
的反义词,DEFAULT
与NOT NULL
约束的存在与否没有任何关系。- 使用
GENERATED BY DEFAULT AS IDENTITY
在最新版本的H2如果你不使用MySQL兼容模式.AUTO_INCREMENT
是一种传统的非标准和不可移植的语法,在H2中它应该只在这种兼容模式下使用。