如果旧记录被更新,如何插入新记录


How to insert a new record if old record is updated?

我使用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`)