繁体   English   中英

如果旧记录已更新,如何插入新记录?

[英]How to insert a new record if old record is updated?

我正在使用mysql作为php应用程序的数据库。

我必须解析一个csv工作表,并且仅在更新旧记录时才将数据插入数据库。

一种方法是使用我在csv中拥有的ID从数据库中获取记录,然后检查值,如果存在差异,则添加新记录,但是由于我有数百MB的数据,因此我无法从中来回执行此操作数据库,有没有一种方法可以完全在sql中完成呢?

ID不是唯一的,必须插入的新记录将使用相同的ID。

例如,以下是当前记录
| 1001 | M丹麦语| 新加坡|

以及国家/地区对美国的更改,表格将有两行,如下所示
| 1001 | M丹麦语| 新加坡|
| 1001 | M丹麦语| 美国|

正如我从您的问题中了解到的那样,您可以在将csv数据插入数据库检查该记录之前,对数据库表名称的“更新”值0或1(false或true)进行另一个原始处理,然后将其作为值(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中做一些快速工作。

将自动递增ID添加到表中。 然后在php中运行查询以选择与csv中的行匹配的最后一个ID。 比较两者,如果有差异则插入。 这是我想到的表结构最有效的方法。

我会创建一个数据不变的表和一个具有重复id(csv Id)的表,仅在更改时才插入。 这将使您的工作变得轻松快捷。 第二个表将具有自动递增的ID,以检查与csv中的ID是否相同的最后一行。

希望清楚。

您可以对重复的密钥更新sql运行插入忽略。 仅当您在要唯一的列中定义了唯一键时,此方法才有效

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`)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM