在将csv数据导入到MySQL时,需要引入3部分逻辑

问题描述:

在mysql中,有没有一种方法可以在LOAD DATA期间评估数据库中是否存在记录,而不是基于多列索引导入的数据?在将csv数据导入到MySQL时,需要引入3部分逻辑

例子:

更新数据库中的记录,如果名称+ UID存在于数据库中,并与其他的UID的名称在进口存在,但进口不包括一些名称+ UID是在数据库。

如果没有,定期运行查询更新Name + UID组合中的记录会更容易,其中匹配的Name具有新的创建日期的记录或其他UID的更新日期?

我结束以相对直接的方式做到这一点。这就是说,我仍然有兴趣知道是否有人在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; 

你会放一个唯一索引UniqueIDName启动,这将确保数据库知道这两个的组合将是一个Duplicate Key那么你的PDO将看起来像

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

嗯,对我来说,这看起来像它会更新固定日期,如果这两个文件包含名称+ UID,但我只想要更新的固定日期,如果进口不具有名称+ UID存在在数据库中。考虑扫描结果的补救 – wahyzcrak