【问题标题】:Update some columns of a record if that record is being inserted during a BulkInsert如果在 BulkInsert 期间插入该记录,则更新该记录的某些列
【发布时间】:2015-12-18 13:31:18
【问题描述】:

数据库上的表:

表专辑 - ID_ON_DISCOGS(唯一) - ARTIST_ID - LABEL_ID

我必须在这个表中批量插入记录。

问题在于,有时可能会发生批量插入尝试插入 ID_ON_DISCOGS 已存在的记录。

在这种情况下,我想用新值更新 ARTIST_ID 或 LABEL_ID 字段。

例子:

ALBUM RECORD 已在数据库中:

 |ID_ON_DISCOGS | ARTIST_ID | LABEL_ID|
 :------------------------------------:
 |123           | 345       | null    |
 :------------------------------------:

我尝试插入的专辑记录:

 |ID_ON_DISCOGS | ARTIST_ID | LABEL_ID|
 :------------------------------------:
 |123           | null       | 567    |
 :------------------------------------:

我想达到的结果记录:

 |ID_ON_DISCOGS | ARTIST_ID | LABEL_ID|
 :------------------------------------:
 |123           | 345        | 567    |
 :------------------------------------:

可能是适合内容提供商的解决方案。

【问题讨论】:

    标签: sql sqlite sql-update android-contentprovider bulkinsert


    【解决方案1】:

    就个人而言,我会先执行批量插入。完成后,我将执行更新语句。也许尝试使用 CTE 进行更新?参见 mobsite 的回答,例如:SQL UPDATE row Number

    【讨论】:

      【解决方案2】:

      这将更新所有具有匹配 ID_ON_DISCOGS 的记录。

       REPLACE INTO ALBUM
      (ID_ON_DISCOGS, ARTIST_ID, LABEL_ID)
      SELECT src.ID_ON_DISCOGS, src.ARTIST_ID, src.LABEL_ID
      FROM ImportTable src
      INNER JOIN ALBUM dest
      ON src.ID_ON_DISCOGS = dest.ID_ON_DISCOGS
      

      下一个查询将插入尚未在表中的剩余记录。

      INSERT INTO ALBUM
      SELECT imp.ID_ON_DISCOGS
             ,imp.ARTIST_ID
             ,imp.LABEL_ID
      FROM ImportTable imp
      WHERE imp.ID_ON_DISCOGS NOT IN (SELECT ID_ON_DISCOGS FROM ALBUM)
      

      【讨论】:

      • 没有注意到它是 SQLLite。我将其更新为使用替换。
      • 此查询不会从旧行中获取非 NULL 值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2010-12-10
      • 1970-01-01
      相关资源
      最近更新 更多