【问题标题】:Check for existing entries in Database or recreate table?检查数据库中的现有条目或重新创建表?
【发布时间】:2011-05-26 14:59:47
【问题描述】:

我有一个 PHP 脚本,它每 4 小时从服务器中提取一个文件并将其中的值插入到数据库中。

这个文件可以而且很可能在 4 小时内(或者我最终选择的任何时间范围)内发生变化。这是属性及其所有者的列表。

检查文件并将其与每个数据库条目进行比较并在需要时进行更新,或者创建一个临时表然后使用 SQL 查询比较两者会更好吗?

【问题讨论】:

  • 文件有多大?平均有多少数据发生变化?有多少是全新的记录,有多少是现有记录发生了变化?
  • 目前大约 50kb 大,大约 2000 行。它没有任何用户交互,它只是由 cron 运行。这可能是少量的更新和少量的新更新

标签: php mysql compare


【解决方案1】:

无。

我个人会做的是使用ON DUPLICATE KEY UPDATE 运行INSERT 命令(假设您的表格设计正确,并且您使用文件中的至少一条信息作为您应该基于的UNIQUE 键根据您的评论)。

原因

创建临时表很麻烦。 比较也很麻烦。您需要选择一条记录,比较一条记录,如果不相等则更新记录等等 - 比较一条信息只是浪费时间,但有更好的方法来做到这一点。

如果您只插入您找到的所有内容,并且如果发生冲突 - 这意味着记录存在并且很可能需要更新,这会容易得多。

这样,您只需 1 次查询就可以处理好所有事情,并且还保留了数据完整性,因此您可以继续填写表格或使用新记录进行更新。

【讨论】:

  • 这是一个比我建议的更优雅的解决方案。 =) 我确实忘记提到我还需要删除文件中不再存在的任何数据库记录。有没有简单的方法来做到这一点?
  • 删除是另一回事 :) 很快想到的是DELETE FROM <table> WHERE <some key> NOT IN(<list of keys you get from file>)。当然,这可能会很慢、不准确,具体取决于文件大小和您的 MySQL 配置。执行INSERT 后运行它。
  • 我认为它会是这样的。感谢“NOT IN”提示,我真的应该阅读 mySql。 =) 为帮助干杯。
  • 您可能已经注意到 SQL 真的非常接近人类语言,不要害怕尝试 :) 很高兴我能提供帮助。
【解决方案2】:

我认为最好下载文件并更新现有表,可能使用 REPLACE 或 REPLACE INTO。 “REPLACE 的工作方式与 INSERT 完全相同,只是如果表中的旧行与 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,则在插入新行之前删除旧行。” http://dev.mysql.com/doc/refman/5.0/en/replace.html

【讨论】:

    【解决方案3】:

    大概您有一个必须匹配的列列表,以便您确定这两件事是否匹配。

    如果您在这些列上创建唯一索引,则可以使用INSERT ... ON DUPLICATE KEY UPDATE(manual) 或REPLACE INTO ...(manual)

    【讨论】:

      猜你喜欢
      • 2014-04-21
      • 2021-03-04
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 2017-01-10
      • 2017-04-02
      相关资源
      最近更新 更多