【问题标题】:Need to introduce 3 part logic when importing csv data into MySQL将csv数据导入MySQL时需要引入3部分逻辑
【发布时间】:2018-03-18 16:32:39
【问题描述】:

在mysql中,有没有办法在加载数据期间评估数据库中是否存在记录,但基于多列索引的导入数据中是否存在记录?

例子:

如果数据库中存在Name + UID,并且导入中存在具有其他UID的Name,则更新数据库中的记录,但导入不包含数据库中的某些Name + UID。

如果不是,也许定期运行一个查询来更新来自 Name + UID 组合的记录,其中匹配的 Name 具有较新创建日期的记录,或更新其他 UID 的日期?

【问题讨论】:

    标签: php mysql csv import


    【解决方案1】:

    您首先在 UniqueIDName 上放置一个唯一索引,这将确保数据库知道这两者的组合将是 Duplicate Key 然后您的 PDO 看起来像

    INSERT INTO `myTbl` (`UniqueID`,`Name`,`FixedDate`)
    VALUES :UniqueID, :Name, :FixedDate
    ON DUPLICATE KEY UPDATE `FixedDate` = VALUES(FixedDate)
    

    【讨论】:

    • 嗯,在我看来,如果两个文件都包含名称+UID,它会更新固定日期,但如果导入没有名称+UID,我只想更新固定日期存在于数据库中。考虑修复扫描结果
    【解决方案2】:

    我最终以相对直接的方式进行了此操作。话虽如此,我仍然很想知道是否有人在 MySQL (MariaDB 5.7) 中有更简单/更有效的方法

    我在 Host+CVE 上有一个多列索引来捕获重复项。我还有一个 createDate 和 updateDate 列。 createDate 在导入时自动更新,updateDate 在导入时自动更新,或者在记录更新时自动更新,除非记录 updateDate 发生在下面的导入过程中(我想跟踪我们最后一次使用 GUI 实际接触记录的时间)。

    LOAD DATA LOCAL INFILE '/tmp/Example.csv' INTO TABLE ExampleImport
    FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES;
    
    INSERT INTO ExampleTable (PluginID,CVE,CVSS,Risk,Host,Protocol,Port,Name,Synopsis,Description,Solution,SeeAlso,PluginOutPut)
    SELECT PluginID, CVE, CVSS, Risk, Host, Protocol, Port, Name, Synopsis, Description, Solution, SeeAlso, PluginOutput
    FROM ExampleImport 
    ON DUPLICATE KEY UPDATE ImportDate = CURRENT_TIMESTAMP, UpdateDate = UpdateDate;
    
    UPDATE ExampleTable x4 
    INNER JOIN (SELECT Host, MAX(UpdateDate) MaxDate 
            FROM ExampleTable
            GROUP BY Host
            ) x2 ON x4.Host = x2.Host
    SET FixDate = CURDATE(), x4.UpdateDate = x4.UpdateDate
    WHERE x4.UpdateDate < x2.MaxDate;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 2013-12-21
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      相关资源
      最近更新 更多