2017-10-06 102 views
-2

在mysql中,有沒有一種方法可以在LOAD DATA期間評估數據庫中是否存在記錄,而不是基於多列索引導入的數據?在將csv數據導入到MySQL時,需要引入3部分邏輯

例子:

更新數據庫中的記錄,如果名稱+ UID存在於數據庫中,並與其他的UID的名稱在進口存在,但進口不包括一些名稱+ UID是在數據庫。

如果沒有,定期運行查詢更新Name + UID組合中的記錄會更容易,其中匹配的Name具有新的創建日期的記錄或其他UID的更新日期?

回答

0

我結束以相對直接的方式做到這一點。這就是說,我仍然有興趣知道是否有人在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; 
0

你會放一個唯一索引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