【问题标题】:Inserting well over 100,000 records into SQLite将超过 100,000 条记录插入 SQLite
【发布时间】:2012-04-25 21:41:19
【问题描述】:

我有一个需要定期更新的数据库。我的雇主想在 MS Access 中保留它的基本实例,并在本地 SQLite 表中更新一个。

我已经能够从 MS Access 表中获取所有数据(到 XML 中),但是当我尝试将其插入到 SQLite 表中时,我收到错误,即复合中的术语太多选择语句。

我知道 SQLite 限制复合选择插入到 500,但这个数据库超过 150,000 行。我不知道如何移动数据。

有人有什么想法吗?

这是我尝试使用的代码:

var sqlItem:String="INSERT INTO items (itemID,barcode,desc,brandNum,size,units,multQty,multPrice,price,brand,cat01,catSub,cost,srp,lastPriceChangeDate,lastScanDate,addDate,chgDate) ";
for each(var i:XML in itemList.item){
    sqlItem=sqlItem+"SELECT "+
    parseInt(i.itemID,10)+","+
    parseInt(i.barcode,10)+","+
    "\""+i.description+"\","+
    parseInt(i.brandNum,10)+","+
    "\""+i.size+"\","+
    "\""+i.units+"\","+
    parseInt(i.multQty,10)+","+
    "\""+i.multPrice+"\","+
    "\""+i.price+"\","+
    "\""+i.brand+"\","+
    "\""+i.cat01+"\","+
    "\""+i.catSub+"\","+
    "\""+i.cost+"\","+
    "\""+i.srp+"\","+
    "\""+i.lastPriceChangeDate+"\","+
    "\""+i.lastScanDate+"\","+
    "\""+i.addDate+"\","+
    "\""+i.chgDate+"\""+
    " UNION ";
}
sqlItem=sqlItem.substring(0,sqlItem.length-7);
itemStmt.text=sqlItem;
try{
    itemStmt.execute();
}catch(error:SQLError){
    trace("Update USER Database - ERROR: "+error.detailID +" - "+error.details );
}

这是我正在读入数据库的 XML 示例:

<items>
    <item>
        <itemID>1234</itemID>
        <barcode>01111111111111</barcode>
        <description>Product Description</description>
        <brandNum>1</brandNum>
        <size>1</size>
        <units>oz.</units>
        <multQty>1</multQty>
        <multPrice>0.85</multPrice>
        <price>0.85</price>
        <brand>Product Brand</brand>
        <cat01>Product Category</cat01>
        <catSub>(none)</catSub>
        <cost>0.10</cost>
        <srp>0.95</srp>
        <lastPriceChangeDate>1/9/2009 3:32:29 PM</lastPriceChangeDate>
        <lastScanDate>1/9/2009 3:32:29 PM<lastScanDate>
        <addDate/>1/9/2009 3:32:29 PM<addDate/>
        <chgDate>1/9/2009 3:32:29 PM</chgDate>
    </item>
    <item>
        <itemID>1234</itemID>
        <barcode>01111111111111</barcode>
        <description>Product Description</description>
        <brandNum>1</brandNum>
        <size>1</size>
        <units>oz.</units>
        <multQty>1</multQty>
        <multPrice>0.85</multPrice>
        <price>0.85</price>
        <brand>Product Brand</brand>
        <cat01>Product Category</cat01>
        <catSub>(none)</catSub>
        <cost>0.10</cost>
        <srp>0.95</srp>
        <lastPriceChangeDate>1/9/2009 3:32:29 PM</lastPriceChangeDate>
        <lastScanDate>1/9/2009 3:32:29 PM<lastScanDate>
        <addDate/>1/9/2009 3:32:29 PM<addDate/>
        <chgDate>1/9/2009 3:32:29 PM</chgDate>
    </item>
</items>

【问题讨论】:

  • 这是否像“以 500 步循环遍历源数据”一样简单?
  • 可能是这样,但我不确定如何每 500 条记录循环一次 XML 数据。我曾想过尝试这样的事情,但我没有成功地让它正确地循环......
  • 一旦您获得了您的项目元素的 XMLListCollection;只需使用 for 循环并增加计数器变量,如下所示: counter+= 500 in each iteration 。该计数器本质上是插入语句的第一个元素。
  • 感谢 Flextras,它起作用了...我昨天尝试了类似的方法,但无法让它起作用。我只是在 for each 循环中放置了一个计数器,以每 495 条记录执行一次查询。感谢您的帮助...

标签: xml database apache-flex sqlite air


【解决方案1】:

试试这个解决方案吧!!!我什至在基于 sqlite 的 Web Sql DB 中测试了这个解决方案

选择 sqlite_version()

3.6.19

INSERT INTO items (val)  
select * from
(select 1  val  union all
 select 2   val union all
 select 3   val union all
 select 4   val union all
 ...
 select 500 val
)
union all
select * from
(select 501  val    union all
 select 502 val union all
 select 503 val union all
 select 504 val union all
 ...
 select 1000    val
)
union all
select * from
(select 1001  val   union all
 select 1002    val union all
 select 1003    val union all
 select 1004    val union all
 ...
 select 1500    val
)
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2017-01-31
    • 2015-09-15
    相关资源
    最近更新 更多