我使用mysql作为php应用程序的数据库。
我必须解析csv表,并且只有在更新旧记录时才将数据插入数据库。
一种方法是使用我在csv中的Ids从数据库中获取记录然后检查值,如果存在差异则添加新记录,但因为我有数百MB的数据,所以我无法做到这一点从数据库中,有没有办法在sql中完成它?
ID不是唯一的,必须插入的新记录将使用相同的ID。
例如以下是当前记录
| 1001 | M丹麦语|新加坡|
并且国家/地区更改为美国,表格将有两行如下
| 1001 | M丹麦语|新加坡|
| 1001 | M丹麦语|美国|
答案 0 :(得分:0)
正如我从您的问题中所理解的那样,在将csv数据插入数据库检查该记录然后将您的操作作为其值之前,您可以在数据库表名中生成另一个原始名称“已更新”值0或1(false或true)虚假或真实)
答案 1 :(得分:0)
就相对成本而言,往往DB的往返通常非常昂贵。当遇到这种情况时,我通常会尝试使用要比较的值来存储本地地图(即带有字符串键的PHP数组),这样我就可以只绕过数据库所需的更新/插入。
为了说明,这里有一个过于简化的例子:
// variable created in php file from previous run
$records = [
"1001 | M Danish | Singapore" => true
// ... other records
];
// check if value present, a constant time operation on a map
if (!isset($records["1001 | M Danish | USA"])) {
// insert into db
}
值得注意的是,上面的示例不会遍历所有记录,处理重复键,删除旧键等等。但是,希望它能为您提供大大减少数据库往返(或一个整体大小)的一般想法。在进行查询之前,通过在PHP中快速完成一些工作。
答案 2 :(得分:0)
在表格中添加自动增量ID。然后在php中运行一个查询以选择与csv中的行匹配的最后一个Id。比较两者并插入是否存在差异。这是我能用你的表结构思考的最有效方式。
我会创建一个包含不会更改的数据的表和一个带有重复项id(csv Id)的表,您只能在更改中插入。这将使您的工作变得更轻松,更快捷。第二个表将具有自动增量Id,以检查具有来自csv的相同Id的最后一行。
希望它清楚。
答案 3 :(得分:0)
您可以在重复密钥更新sql上运行insert ignore。 只有在您想要唯一的列中定义了唯一键时,这才有效
insert ignore into table1(col1, col2)
values ('val1', 'val2')
on duplicate key update
col1 = VALUES(`col1`),
col2 = VALUES(`col2`)
如果没有找到行
,这将更新值为val1,val2或insert的行如果你有很多插入/更新,你可以使用批量
insert ignore into table1(col1, col2)
values
('val1', 'val2'),
('val3', 'val4'),
('val5', 'val6'),
('val7', 'val8'),
('val9', 'val10'),
('val11', 'val12'),
('val13', 'val14')
on duplicate key update
col1 = VALUES(`col1`),
col2 = VALUES(`col2`)