作为DB noob,我正在尝试生成SQLite语句以导入带有“First_Reported”和“Last_Reported”日期戳的记录,但似乎无法让“First_Reported”正常工作。
我正在尝试导入几年的扫描。会有很多重复项,所以如果记录已经存在,我只想更新“Last_Reported”列。如果没有,则创建记录。
我搜索了SO并尝试了一些其他解决方案(SQLite - UPSERT *not* INSERT or REPLACE),我似乎无法做到这一点。我不确定我是否会以错误的方式解决这个问题,或者只是发胖了?
有什么建议吗?对于成千上万的行,我应该使用其他东西吗?我在寻找效率而不想要“正常”的东西。我想以“正确”的方式做到这一点。
我这样创建了表格;
CREATE TABLE Scan_Results (First_Reported text, Last_Reported text, Hostname text, IPAddress text, Network text, OSInformation text, DisplayPath text, TestName text, Message text, FindingObject text, FindingResult text, FindingExpr text, UNIQUE (Hostname, IPAddress, Network, OSInformation, DisplayPath, TestName, Message, FindingObject, FindingResult, FindingExpr));
我正在尝试使用此插入/更新行;
WITH new (First_Reported, Last_Reported, Hostname, IPAddress, Network, OSInformation, DisplayPath, TestName, Message, FindingObject, FindingResult, FindingExpr) AS ( VALUES('2017-08-15', '2017-08-30', 'someHost', 'someIP', 'someNet', 'someOS', 'someDisplay', 'someTest', 'someMessage', 'someObject', 'someResult', 'someExpr') )
INSERT OR REPLACE INTO Scan_Results (First_Reported, Last_Reported, Hostname, IPAddress, Network, OSInformation, DisplayPath, TestName, Message, FindingObject, FindingResult, FindingExpr)
SELECT old.First_Reported, new.Last_Reported, new.Hostname, new.IPAddress, new.Network, new.OSInformation, new.DisplayPath, new.TestName, new.Message, new.FindingObject, new.FindingResult, new.FindingExpr
FROM new LEFT JOIN Scan_Results AS old ON new.Hostname = old.Hostname;
答案 0 :(得分:0)
我似乎已经通过不同的格式化了(可能是?)。让像我这样的菜鸟更容易阅读。这也是我之前尝试过的一个答案。我的另一个问题仍然存在。这是处理成千上万条记录的“正确”方式吗?或者有更有效的方法吗?
REPLACE INTO Scan_Results (
First_Reported,
Last_Reported,
Hostname,
IPAddress,
Network,
OSInformation,
DisplayPath,
TestName,
Message,
FindingObject,
FindingResult,
FindingExpr)
SELECT
IFNULL(old.First_Reported,"05/01/2015"),
"12/01/2017",
"someHost",
"someIP",
"someNetwork",
"someOS",
"someMessage",
"someObject",
"someMessage",
"someObject",
"someResult",
"someExpr"
FROM Scan_Results
LEFT JOIN Scan_Results AS old ON old.Hostname = "someHost";