我的 CSV 文件中有 270000 条记录,其中包含 user_id、book_ISBN 和 book_ rating 列,我需要将这些记录插入到多对多表中。我使用 openCSV 库解析数据,结果是一个列表。
public List<UserRatingDto> uploadRatings(MultipartFile file) throws IOException{
BufferedReader fileReader = new BufferedReader(new
InputStreamReader(file.getInputStream(), "UTF-8"));
List<UserRatingDto> ratings = new CsvToBeanBuilder<UserRatingDto>(fileReader)
.withType(UserRatingDto.class)
.withSeparator(';')
.withIgnoreEmptyLine(true)
.withSkipLines(1)
.build()
.parse();
return ratings;
}
Run Code Online (Sandbox Code Playgroud)
这不存在性能问题,解析大约需要 1 分钟。但是,为了将它们插入到表中,我需要从数据库中获取书籍和用户以形成关系,我尝试使该方法与 @Async 注释异步,我尝试了并行流,我尝试将对象放入放入堆栈并使用 saveAll() 批量插入,但仍然花费太多时间。
public void saveRatings(final MultipartFile file) throws IOException{
List<UserRatingDto> userRatingDtos = uploadRatings(file);
userRatingDtos.parallelStream().forEach(bookRating->{
UserEntity user = userRepository.findByUserId(bookRating.getUserId());
bookRepository.findByISBN(bookRating.getBookISBN()).ifPresent(book -> {
BookRating bookRating1 = new BookRating();
bookRating1.setRating(bookRating.getBookRating());
bookRating1.setUser(user);
bookRating1.setBook(book);
book.getRatings().add(bookRating1);
user.getRatings().add(bookRating1);
bookRatingRepository.save(bookRating1);
});
});
}
Run Code Online (Sandbox Code Playgroud)
这就是我现在所拥有的,有什么我可以改变以使其更快吗?
当我使用 执行包含 SQL 命令的文件时psql -f,我得到如下输出(已截断):
CREATE DOMAIN
CREATE TABLE
CREATE TABLE
INSERT 0 1
INSERT 0 1
INSERT 0 1
Run Code Online (Sandbox Code Playgroud)
数字0和1是什么意思?(我认为1是修改的行数。但是0?)我在PostgreSQL的官方文档或其他任何地方都找不到它。
我在Firebird 2.5上工作,我有两个表,所有列都相似,只有一个有自动增量的主键和主表的非空外键字段(A)
我知道我可以使用这样的sql来插入两个表中的所有值
insert into table1 select * from table2 where somthing = 'foo'
Run Code Online (Sandbox Code Playgroud)
但是字段(A)有什么方法可以在同一个sql语句中手动插入这个值?因为这是唯一需要手动输入的字段
谢谢
如果条目不存在,我想将数据插入到多个表中.
在我的情况下,我有一个餐厅餐桌,一个位置表,一张foodtype桌子和一些帮助表,如restaurant_location和restaurant_foodtype.现在我想插入一个新的餐厅条目,如果条目不存在,则填写位置和食物类型信息.
所以类似于:
IF NOT (select 1 from restaurant where name='restaurantname') THEN
INSERT INTO restaurant(x,y) VALUES (valuex,valuey);
INSERT INTO restaurant_location(rest_id,..) VALUES (rest_id,..);
INSERT INTO restaurant_foodtype(rest_id,..) VALUES (rest_id,..);
...
END IF
Run Code Online (Sandbox Code Playgroud)
我怎么能用简单的SQL做到这一点?
这段代码非常适合我:
if (someStr == null)
da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = DBNull.Value;
else
da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr;
Run Code Online (Sandbox Code Playgroud)
但我的直觉告诉我,可能有一个单行版本.就像是:
da.InsertCommand.Parameters.Add("@SOMESTR", SqlDbType.NVarChar).Value = someStr==null ? DBNull.Value : someStr ;
Run Code Online (Sandbox Code Playgroud)
但是我上面发布的单线程当然失败了,因为DBNull.Value没有强制转换为String.
有没有办法完成我想要的一个班轮?
我在我的android项目中设置了一个ORMLite数据库.
我有一个名为RbFehler的类,其中包含以下字段:
@DatabaseField(columnName = "DATUM_LA", dataType = DataType.DATE_STRING,
format = "yyyy-MM-dd HH:mm:ss")
public Date datum_la;
Run Code Online (Sandbox Code Playgroud)
我有一些逻辑,从存储SQL插入语句的文本文件中导入数据.一行看起来像这样:
INSERT INTO RbFehler (KATALOGART,SYST,SUBSYST,KOMP,BAUTEIL,BEZ,PSYST,PSUBSYST,
PKOMP,PBAUTEIL,INAKTIV,GELOESCHT,DATUM_LA)
VALUES ('VW','4F5AB211','0600','4F5AA900','0010','Venturirohr','4F5AB211',
'0600','4F5AA900','0000','0','0',2012-06-04 08:08:08);
Run Code Online (Sandbox Code Playgroud)
但是当我打电话时,我总是得到以下错误:
dao.execute RawNoArgs(line);
java.lang.Illegal Argument Exception: Field class java.sql.Date for field
Field Type:name=datum_la,class=RbFehler is not valid for data
persister com.j256.ormlite.field.types.DateStringType@416ed260
Run Code Online (Sandbox Code Playgroud)
我也尝试在SQL语句的日期周围添加"'"但得到相同的错误.如果我从SQL和类中删除日期一切正常.
谁能告诉我我做错了什么?我只发现了这样的问题:ormlite读取日期为'yyyy-MM-dd'
我一直无法为这个问题找到合适的解决方案,我知道这很简单,但我忘记了怎么做.我有一个带有一个textfield字段的表单,用户不需要填写.我想在数据库中插入NULL,而不是它当前正在执行的0.不过,我不确定我错过了什么.文本框已命名taxRateTxt,我目前无法为我工作:
try
{
using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["AbleCommerce"].ToString()))
{
cn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
cmd.Parameters.Add(new SqlParameter("@FIPSCountyCode", countyCodeTxt.Text));
cmd.Parameters.Add(new SqlParameter("@StateCode", stateCodeList.SelectedValue));
cmd.Parameters.Add(new SqlParameter("@CountyName", countyNameTxt.Text));
string taxStr = taxRateTxt.Text;
//test for an empty string and set it to db null
if (taxStr == String.Empty)
{
taxStr = DBNull.Value;
}
cmd.Parameters.Add(new SqlParameter("@TaxRate", taxStr));
if (AddBtn.Visible == true)
cmd.CommandText = addQuery;
if (EditBtn.Visible == true)
{
cmd.CommandText = editQuery;
}
cmd.ExecuteNonQuery();
cn.Close();
}
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
我正在使用Oracle Database 11g并使用SQL命令行.
我创建了表,然后像往常一样插入值.当我使用select查询查看插入的行时,我看到它们没有任何问题.
SQL> connect
Enter user-name: hotel
Enter password:
Connected.
SQL> select * from hotel
2 ;
no rows selected
SQL> insert into hotel values('The Taj',11,'New York',5);
1 row created.
SQL> select * from hotel;
NAME HOTEL_ID
-------------------------------------------------- ----------
LOCATION STAR_RATING
-------------------------------------------------- -----------
The Taj 11
New York 5
Run Code Online (Sandbox Code Playgroud)
但是,在我关闭sql命令行之后,再次打开并再次使用select查询查看所有行...所有行都消失了.我得到"没有选择行"
SQL> connect
Enter user-name: hotel
Enter password:
Connected.
SQL> select * from hotel;
no rows selected
SQL>
Run Code Online (Sandbox Code Playgroud)
我不知道为什么会这样.请帮忙!我对这个全新.所以请不要判断:)
我有一张桌子table1(id整数,Namevarchar,Age整数)
在表中插入行时,我使用两个语句。
INSERT INTO TABLE1('1','John','33');
和 INSERT INTO TABLE1(1,'John',33);他们两个都工作正常。在第一条insert语句中,我也使用了整数数据类型的单引号之间的值。
我能知道两个语句之间的区别是什么吗?
我有一张看起来像这样的桌子
CREATE TABLE bob
(ID INT IDENTITY,
blah VARBINARY(MAX),
ts DATETIME2 DEFAULT GETUTCDATE())
Run Code Online (Sandbox Code Playgroud)
我们假设这个陈述
INSERT INTO dbo.bob
( blah )
VALUES (
@blarg
)
Run Code Online (Sandbox Code Playgroud)
需要10秒钟才能完成.
如果插入开始的时间是t.ts会在新创建的行上有t或t + 10秒吗?换句话说,是在插入的开头或插入的结尾(或其他一些规则)生成的默认值?
sql-insert ×10
postgresql ×3
sql ×3
c# ×2
sql-server ×2
.net ×1
android ×1
bulkinsert ×1
database ×1
date-format ×1
dbnull ×1
firebird ×1
oracle ×1
ormlite ×1
spring-boot ×1
string ×1