我使用mysql作为php应用程序的数据库。
我必须解析csv表,并且只有当旧记录更新时才将数据插入数据库。
一种方法是使用id从数据库中获取记录,我在我的csv,然后检查值,如果有差异,然后添加一个新的记录,但因为我有数据在数百mb我不能这样做来回从数据库,有一种方法做它完全在sql ?
Id不是唯一的,必须插入的新记录将使用相同的Id。
例如,下面是当前记录
| 1001 | M丹麦|新加坡|
和国家更改为USA,表将有如下两行
| 1001 | M丹麦|新加坡|
| 1001 | M丹麦|美国|
正如我从你的问题中所理解的,你可以在你的数据库表名称"更新"值0或1 (false或true)之前,在你插入csv数据到数据库检查该记录,然后做你的动作作为它的值(false或true)
就相对成本而言,到数据库的往返通常相当昂贵。当面对这种情况时,我通常尝试存储一个本地映射(即一个带有字符串键的PHP数组),其中包含要比较的值,允许我只往返DB所需的更新/插入。
为了说明,这里有一个过于简化的例子:
// 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中做一些快速的工作来大大减少DB往返(或一次往返的总体大小)。
为您的表添加一个自动递增Id。然后在php中运行查询以选择与csv中的行匹配的最后一个Id。比较两者,如果有差异就插入。这是我能想到的使用你的表结构的最有效的方法。
我会创建一个数据不改变的表和一个重复id(csv id)的表,你将只在更改时插入。这将使事情对你来说更容易、更快捷。第二个表将有一个auto increments Id,用于检查csv中具有相同Id的最后一行。
您可以在重复键update sql上运行insert ignore。只有当您希望在列/s中定义唯一键
时,这才会起作用。insert ignore into table1(col1, col2)
values ('val1', 'val2')
on duplicate key update
col1 = VALUES(`col1`),
col2 = VALUES(`col2`)
这将用值val1, val2更新行,如果没有找到,则插入
如果你有很多插入/更新,你可以使用这个
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`)