标签: sql-insert

优化 Spring Boot 中的数据获取和插入

我的 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)

这就是我现在所拥有的,有什么我可以改变以使其更快吗?

database bulkinsert sql-insert spring-data-jpa spring-boot

4
推荐指数
1
解决办法
4319
查看次数

在PostgreSQL中执行直接SQL后“INSERT 0 1”是什么意思?

当我使用 执行包含 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的官方文档或其他任何地方都找不到它。

postgresql sql-insert

4
推荐指数
1
解决办法
3151
查看次数

Firebird sql从另一个表中只插入一个不同字段的典型记录

我在Firebird 2.5上工作,我有两个表,所有列都相似,只有一个有自动增量的主键和主表的非空外键字段(A)

我知道我可以使用这样的sql来插入两个表中的所有值

 insert into table1 select * from table2 where somthing = 'foo'
Run Code Online (Sandbox Code Playgroud)

但是字段(A)有什么方法可以在同一个sql语句中手动插入这个值?因为这是唯一需要手动输入的字段

谢谢

sql firebird sql-insert

3
推荐指数
1
解决办法
6425
查看次数

如果条目不存在,则使用PostgreSQL进行多次插入

如果条目不存在,我想将数据插入到多个表中.

在我的情况下,我有一个餐厅餐桌,一个位置表,一张foodtype桌子和一些帮助表,如restaurant_locationrestaurant_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做到这一点?

sql postgresql common-table-expression sql-insert

3
推荐指数
1
解决办法
3328
查看次数

是否有更优雅的形式为InsertCommand的NVarChar分配NULL?

这段代码非常适合我:

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.

有没有办法完成我想要的一个班轮?

c# sql-server sqldataadapter sql-insert

3
推荐指数
1
解决办法
1318
查看次数

ORMLite使用SQL插入日期

我在我的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'

android date-format ormlite sql-insert

3
推荐指数
1
解决办法
4242
查看次数

在插入数据库时​​将空字符串设置为null

我一直无法为这个问题找到合适的解决方案,我知道这很简单,但我忘记了怎么做.我有一个带有一个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)

我在这里错过了什么?

.net c# string dbnull sql-insert

3
推荐指数
1
解决办法
1万
查看次数

值得插入oracle中的表没有保存?

我正在使用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)

我不知道为什么会这样.请帮忙!我对这个全新.所以请不要判断:)

oracle sql-insert

3
推荐指数
2
解决办法
4310
查看次数

用于Integer数据类型的带单引号的Insert语句

我有一张桌子table1id整数,Namevarchar,Age整数)

在表中插入行时,我使用两个语句。

  1. INSERT INTO TABLE1('1','John','33');
  2. INSERT INTO TABLE1(1,'John',33);

他们两个都工作正常。在第一条insert语句中,我也使用了整数数据类型的单引号之间的值。

我能知道两个语句之间的区别是什么吗?

sql postgresql sql-insert

3
推荐指数
1
解决办法
7275
查看次数

是否在插入之前或之后生成SQL Server默认值?

我有一张看起来像这样的桌子

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-server sql-insert

3
推荐指数
1
解决办法
29
查看次数