Php 将csv数据导入MySQL时需要引入三部分逻辑

Php 将csv数据导入MySQL时需要引入三部分逻辑,php,mysql,csv,import,Php,Mysql,Csv,Import,在mysql中,有没有一种方法可以在加载数据时评估数据库中是否存在记录,而不是基于多列索引的导入数据中是否存在记录 例如: 如果数据库中存在名称+UID,并且导入中存在具有其他UID的名称,但导入不包括数据库中的某些名称+UID,则更新数据库中的记录 如果不是,也许更容易定期运行查询,从Name+UID组合中更新记录,其中匹配的名称包含具有较新创建日期的记录,或者其他UID的更新日期?您可以在UniqueID和Name上放置一个唯一的索引,这将确保数据库知道这两者的组合是一个重复的键,然后您的P

在mysql中,有没有一种方法可以在加载数据时评估数据库中是否存在记录,而不是基于多列索引的导入数据中是否存在记录

例如:

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


如果不是,也许更容易定期运行查询,从Name+UID组合中更新记录,其中匹配的名称包含具有较新创建日期的记录,或者其他UID的更新日期?

您可以在UniqueID和Name上放置一个唯一的索引,这将确保数据库知道这两者的组合是一个重复的键,然后您的PDO看起来像

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

我最终以一种相对直截了当的方式做了这件事。尽管如此,我仍然有兴趣知道是否有人在MySQL 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;

嗯,在我看来,如果两个文件都包含Name+UID,那么它会更新固定日期,但我只想在导入数据库中没有Name+UID时更新固定日期。想想扫描结果