在将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;
答
你会放一个唯一索引UniqueID
和Name
启动,这将确保数据库知道这两个的组合将是一个Duplicate Key
那么你的PDO将看起来像
INSERT INTO `myTbl` (`UniqueID`,`Name`,`FixedDate`)
VALUES :UniqueID, :Name, :FixedDate
ON DUPLICATE KEY UPDATE `FixedDate` = VALUES(FixedDate)
嗯,对我来说,这看起来像它会更新固定日期,如果这两个文件包含名称+ UID,但我只想要更新的固定日期,如果进口不具有名称+ UID存在在数据库中。考虑扫描结果的补救 – wahyzcrak