【问题标题】:Merging and Adding data with SQLite使用 SQLite 合并和添加数据
【发布时间】:2009-06-04 19:48:45
【问题描述】:

我正在编写一个在 cron 上运行的 PHP 脚本,它从 API [标题(文本)、路径(文本)、访问者(整数)] 提取 JSON 数据并将其存储在 SQLite 数据库中。每次运行时,如果它看到现有标题,它应该将新访问者计数添加到现有访问者中。如果没有,它应该将新数据添加为新行。

这是我的循环的简化视图:

foreach($results as $printresults) {

//this iterates though $title, $path and $visitors

$existing_visitors = $db->query("SELECT SUM(visitors) FROM topten WHERE
title='$title'");
while ($existing_vis_row = $existing_visitors->fetch(SQLITE_NUM)) {


$dupe_enter = $db->query("UPDATE topten SET title='$title', path='$path',
 visitors='$existing_vis_row[0]' WHERE title='$title' ");
    }

$db->query("INSERT INTO topten (id,title,path,visitors,time) VALUES 
(NULL, '$title', '$path', '$visitors', '$time');");

}

然后我将执行SELECT 以提取访问者订购的DISTINCT 行并将其写入文件。由于UPDATE 查询将所有访问者添加到这些行中,因此是否存在所有受骗者并不重要。在某个超时时,我会删除整个表并重新开始收集,因此文件不会变得太笨重。

问题在于,它会在循环的每一次传递中添加总访问者计数,从而使访问者计数完全失控。但是我找不到更好的方法来在每次运行脚本时简单地将数据添加在一起。

【问题讨论】:

    标签: php sql sqlite


    【解决方案1】:

    伪代码:

     for($json_records as $rec){
         $row = SELECT visitors FROM topten WHERE title = $rec['title']
         if($row) 
             //record exists, add visitors and update
             $sum_visitors = $row['visitors'] + $rec['visitors']
             UPDATE topten SET visitors = $sum_visitors WHERE title = $rec['title'] 
         else 
             //record doesn't exist, insert new
             INSERT topten (title, visitors) VALUES ($rec['title'], $rec['visitors'])
     }
    

    也许?

    【讨论】:

      【解决方案2】:

      避免上当。设置一个唯一的密钥并使用INSERT OR REPLACE ... 而不是自己做。

      类似于CREATE UNIQUE INDEX 'title_path' ON topten (title, path)。这将不可能有两个具有相同标题和路径字段的记录。所以,如果你只是盲注INSERT ....,如果它是一个骗子,你会得到一个冲突错误。

      所以,只需使用INSERT OR REPLACE ....,这将首先检查任何唯一索引,如果已经有记录,则将其删除,然后进行插入。当然这都是原子的(所以其他进程检查不会看到记录消失并重新出现)。

      【讨论】:

      • 你能帮我把它简化一下吗?我不太擅长 SQL。还删除了对 JSON 的提及。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多