簡體   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