在mysql中,有沒有一種方法可以在LOAD DATA期間評估數據庫中是否存在記錄,而不是基於多列索引導入的數據?在將csv數據導入到MySQL時,需要引入3部分邏輯
例子:
更新數據庫中的記錄,如果名稱+ UID存在於數據庫中,並與其他的UID的名稱在進口存在,但進口不包括一些名稱+ UID是在數據庫。
如果沒有,定期運行查詢更新Name + UID組合中的記錄會更容易,其中匹配的Name具有新的創建日期的記錄或其他UID的更新日期?
在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